2014-12-05 132 views
2

這個程序違背了我在C中學過和學過的所有東西。這是如何編譯的?爲什麼這不需要是int main?爲什麼不能返回0?你不需要在main之上初始聲明sub()嗎?這使我感到厭惡。我喜歡把我的功能放在主要位置。程序編譯有錯誤

#include <stdio.h> 

main() 
{ 
    sub(); 
    sub(); 
} 

sub() 
{ 
    static int y = 5; 
    printf(" y is %d \n",y); 
    y++; 
} 

的gcc版本是:

gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) 

這是一個老版本好像而不是瘋狂的老。

https://www.gnu.org/software/gcc/releases.html

如何檢查,如果這是C90或C89?

+1

所有這些關於「C標準如何允許這樣做」的gcc問題令人討厭...... **如果不用'gcc -std = c11 -pedantic-errors'進行編譯,那麼gcc不是嚴格的符合C編譯器**,但是是一個非標準的編譯器,它針對大量奇怪的GNU擴展進行編譯。 – Lundin 2014-12-05 07:45:09

+0

在編譯之前先啓用所有的警告http://stackoverflow.com/questions/26488502/which-section-in-c89-standard-allows-the-implicit-int-rule http://stackoverflow.com/questions/8440816/警告隱式聲明的功能http://stackoverflow.com/questions/8220463/c-function-calls-understanding-the-implicit-int-rule – 2014-12-05 10:05:24

+0

@Lundin我應該使用這個,而不是'gcc -std = c90 -pedantic-errors'?維基百科使得它聽起來像c11不支持,直到gcc版本4.6。 http://en.wikipedia.org/wiki/C11_%28C_standard_revision%29我已經提供了我使用的版本。 – cokedude 2014-12-06 00:26:19

回答

4

此代碼使用早期C的一個過時特徵,稱爲隱式int。它的唯一用途是在代碼高爾夫比賽中。事實上,甚至可以用這種方式來聲明變量。變量Ÿ可能很容易被宣佈

static y = 5; 

函數可能未經原型化就被調用。假定該函數準確接收傳遞的參數數量,並遵循「常規促銷」。任何小於int的類型都被提升爲int,並且浮點數被提升爲double

所以函數的行爲彷彿他們爲原型:

int main(void); 
int sub(void); 

要返回比int其他任何類型,返回類型必須指定。


您可以在編譯時指定希望使用的標準。

gcc -ansi 
gcc -std=c99 

並添加-pedantic使gcc相信你真的是這個意思。


奇怪的是,這個代碼不符合嚴格任何標準。 C99不允許隱式int,但允許從main中刪除return 0;。 C90或「ansi」C允許隱式int,但需要return。所以,回報肯定在那裏。

順便說一句,C89和C90是完全一樣的東西。世界兩個半球都需要一段時間才能達成一致。時區和經絡等。這是相同的標準。

1

它不編譯。如果你不告訴gcc是一個嚴格遵守的C編譯器,只是用gcc test.c來調用它,那麼它仍然是一個完全非標準的編譯器,它允許一些奇怪的事情。當它保持其默認設置時,它不符合任何已知的C標準。

gcc -std=c11 -pedantic-errors給出:

test.c:3:1: error: return type defaults to 'int' 
main() 
^ 
test.c: In function 'main': 
test.c:5:4: error: implicit declaration of function 'sub' [-Wimplicit-function-d 
eclaration] 
    sub(); 
    ^
test.c: At top level: 
test.c:9:1: error: return type defaults to 'int' 
sub() 
^ 
test.c: In function 'sub': 
test.c:14:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
+0

同樣,'-std = c99 -pedantic-errors'也不會編譯。 – Lundin 2014-12-05 07:54:45

0

@lundin,請注意:

main() 

不等同於

int main(void) 

因爲無效意味着沒有參數,但()表示有可以是任何數量的參數。