2010-06-30 194 views
29

我試圖在不同版本的cc上編譯兩個不同機器上的相同C文件。靜態聲明遵循非靜態聲明

gcc版本3.2.3說:warning: 'foo' was declared implicitly 'extern' and later 'static'

gcc版本4.1.2說:error: static declaration of 'foo' follows non-static declaration

AFAICT,都具有相同的CFLAGS。我想讓gcc 4.1.2的行爲與gcc 3.2.3類似,也就是找到一個可以將這個錯誤轉化爲警告的選項。

回答

26

從錯誤消息的抱怨,這聽起來像你應該嘗試修復源代碼。編譯器抱怨聲明有差異,比如類似於

void foo(int i); 
... 
void foo(double d) { 
    ... 
} 

這是無效的C代碼,因此編譯器會抱怨。

也許你的問題是,當第一次使用該函數並且編譯器隱式創建一個不會是靜態的時候,沒有原型可用。如果是這樣,解決方案是在第一次使用之前在某處添加原型。

+1

事實上,代碼並沒有對函數進行原型化,所以gcc會假設一個隱式的靜態聲明。正確的答案是,沒有選項可以關閉此錯誤。 – Alsciende 2010-07-01 07:40:38

+0

你可以用'-Werror-implicit-function-declaration'將隱式聲明變成錯誤(在gcc 3.4下,總之;不知道後面的版本)。 – detly 2010-07-01 07:55:54

+0

我做到了,但錯誤仍然存​​在! pastebin.com/2mpnyMPj – 2016-02-01 06:06:05

4

嘗試-Wno-traditional

不過還好,添加的聲明你的靜態功能:

static void foo (void); 

// ... somewhere in code 
    foo(); 

static void foo() 
{ 
    // do sth 
} 
+7

'-Wno-traditional' does not work。 – Alsciende 2010-06-30 10:37:55

+0

我做到了,但錯誤仍然存​​在! http://pastebin.com/2mpnyMPj – 2016-02-01 06:04:52

4

雖然GCC 3.2.3更寬容的問題,GCC 4.1.2以後突出一個潛在的嚴重問題,爲你的程序的鏈接。而不是試圖抑制錯誤,你應該使前向聲明匹配函數聲明。

如果您希望函數是全局可用的(按照前向聲明),那麼不要將它聲明爲靜態的。同樣,如果它縮進爲局部範圍,則使前向聲明靜態匹配。

0

您已經在某個文件中將函數聲明爲非靜態函數,並且您在另一個文件或某處執行爲靜態函數,同樣的文件也會導致此問題。 例如下面的代碼會產生這個錯誤。

void inlet_update_my_ratio(object_t *myobject); 
//some where the implementation is like this 
static void inlet_update_my_ratio(object_t *myobject) { 
//code 
} 

如果您從實施中刪除靜態,錯誤將消失如下。

void inlet_update_my_ratio(object_t *myobject) { 
    //code 
    }