2011-02-13 20 views
129

我最近不得不輸入一個小的C測試程序,並且在這個過程中,我偶然使用vooid而不是void在主函數中犯了一個拼寫錯誤。「int main(vooid)」?這是如何運作的?

但它仍然奏效。

降低下來到其最小完整版,我結束了:

int main (vooid) { 
    return 42; 
} 

但這確實編譯gcc -Wall -o myprog myprog.c),並在運行時,它會返回42

究竟是怎麼這個有效的代碼?


這裏的成績單切割和從我bash殼粘貼展示我在做什麼:

pax$ cat qq.c 
int main (vooid) { 
    return 42; 
} 

pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq 

pax$ echo $? 
42 
+0

通過用一個`int`參數定義main,可以調用** Undefined Behavior **。任何事情都可能發生:) – pmg 2011-02-13 23:40:45

+9

其實,我不確定UB,@ pmg。 ISO特別允許來自標準兩個典型的`main`的其他可能性。爲便於攜帶,您應該使用其中的一種,但我不認爲UB適用於此。 – paxdiablo 2011-02-14 00:50:01

+0

嗯:在託管環境中`main`必須有2個規範形式之一(2.1.2.2)。但是你是對的@pax,在獨立環境中,標識符`main`並不是特別的:如果作爲一個函數使用,它可以是任何類型,並且可以具有任何類型的任意數量的參數。 – pmg 2011-02-14 19:08:53

回答

215

它僅僅使用了「舊式」函數聲明的語法;你隱含聲明一個名爲vooidint參數。

67

這是有效的代碼,因爲包含myprog.c中:

int main (vooid) // vooid is of type int, allowed, and an alias for argc 
{  
    return 42; // The answer to the Ultimate Question 
} 

vooid包含一個加傳遞的參數數目(即argc)。所以,實際上你所做的只是將argc重命名爲vooid

23

在C中,函數參數的默認類型是int。因此,您的程序將vooid一詞視爲int main(int vooid),這是完全有效的代碼。

19

只有gcc -std=c89 -Wall -o qq qq.cgcc -std=gnu89 -Wall -o qq qq.c不發出警告。所有其他標準對vooid發出關於隱含類型int的警告。

int main(chart)表現方式與int main (vooid)相同。

return vooid;返回命令行參數的數量。

我在Debian測試系統上測試了gcc 4.4.5。

相關問題