2016-11-22 54 views
0
//#define static /*empty*/ 
int main() 
{ 
    static int a(); 
    return a(); 
} 
static int a() { return 0; } 

如果我刪除(#define static /*empty*/)的靜態關鍵字,但與靜態 S它與打破這工作得很好:error: static declaration of ‘a’ follows non-static declaration(GCC)。爲什麼我的本地函數聲明不工作,如果函數是靜態的?

這種行爲的原因是什麼?

+1

您需要在調用它們之前聲明函數。打開'-Wall',你會看到有關「隱式聲明函數'a'」的警告等等。或者把函數的定義放在最上面,或者至少在那裏放置前面的聲明。 – psmears

+0

請勿使用隱藏控制流程更改的宏。這很難維護並且容易出錯。 'return'也不是函數;不要在表達式中使用括號,這可能會影響錯誤/拼寫錯誤。 – Olaf

+0

@PSkocik:啊,沒有看到 - 這真的不是一個好主意!部分原因是人們不會在那裏尋找你的聲明,部分是因爲它不會工作 - 「靜態」在函數內部具有與外部不同的含義...... – psmears

回答

1

static關鍵字在另一個函數內聲明函數是無效的(也沒有意義)。 C標準明確禁止這樣的:

C11 draft, 6.7.1

對於具有塊作用域 應具有比其他的extern沒有明確的存儲類說明的功能的標識符的聲明。

+0

我認爲如果它只是充當靜態聲明在全局範圍內(因爲函數不能嵌套)。但非常感謝您的答案,而不是最佳實踐課。 – PSkocik

+1

確實。國際海事組織,如果函數原型/聲明完全禁止在其他函數內(但這是C的歷史),那會更好。回覆:「最佳實踐」 - 我知道你的意思。這對於SO來說是個麻煩。我想每一個問題都需要用「我承諾我不會寫這樣的代碼,並且會盡我所能阻止任何這樣的文字,但我只是在玩/練習某種語言的部分,如果它違背了你的實踐或以任何方式傷害你的感受,我深深的道歉「只是爲了安全。 – usr

相關問題