在此代碼:非標準簽名()編譯成功
int main(int a, int b)
{
printf(" main(int, int) works \n\n");
return 0;
}
的main
簽名是main(int, int)
,和it compiles successfully。爲什麼?
在此代碼:非標準簽名()編譯成功
int main(int a, int b)
{
printf(" main(int, int) works \n\n");
return 0;
}
的main
簽名是main(int, int)
,和it compiles successfully。爲什麼?
因爲C標準不禁止非標準簽名main
(參見例如C99標準的部分5.1.2)。
但是,你會發現,如果你編譯下與-Wall
標誌GCC,它會抱怨:
test.c:4: warning: second argument of 'main' should be 'char **'
它假定要與一個標準的環境相互作用(即進程的命令直插式的參數和返回一個退出狀態),在這種情況下,你必須使用int main(int, char **)
或int main(void)
。如果您使用其他任何內容,則參數的內容將不確定。
沒有指定的主簽名的頭文件,所以沒有將報告錯誤。編譯器通常只檢查返回值,對於main的情況(main的簽名警告依賴於編譯器)。
'沒有指定main的簽名的頭文件,所以不會報錯。我不認爲你在這裏。 – nims
@nims編譯器報告的錯誤不是由頭文件標識的錯誤,因爲沒有用於main的頭文件。該錯誤是由特定於main的編譯器的特殊邏輯生成的。 –
int main(int a, int b)
這是毫無意義傳遞給主函數的參數總是
int main(int argc,char *argv[])
主要是一個不尋常的function.It由操作系統調用,並作爲C++可以在許多系統上運行, C++標準不能規定OS作者將哪些數據傳遞給在該OS上運行的程序 - 您可以在主函數中編寫任何您喜歡的參數,編譯器將接受它。
C標準明確禁止實施爲main
(C99,§5.1.2.2.1/ 1:「在程序啓動時調用的函數名爲main
。該實現聲明不存在該函數的原型。 ),並且與原型不匹配的是(通常)停止編譯代碼。
沒有原型,你回到了編程就像在舊時代,當它是由你來確保你傳遞給函數的參數匹配預期的內容。幸運的是,在main
的情況下,簽名是如此衆所周知,但它很少是一個問題。
編輯:請注意,如果您想足夠糟糕,實際上甚至有可能使用帶有兩個int
參數的版本(儘管該技術在C++中是禁止的)。 main
可以遞歸調用本身,而在這種情況下可以/可以傳遞兩個int
參數:
int main(int a, int b) {
if (a == 2)
main(2, 10);
printf("%d, %d", a, b);
return 0;
}
這是很沒用,因爲它的立場,但給人的總體思路 - 你希望與運行程序任何命令行參數,在這種情況下a
(這將接受你平常叫argc
)通常會1
(即,它試圖傳遞的唯一參數是argv [0]中程序的名稱)。在這種情況下,它會用一些其他值自行調用。發生這種情況時,它會打印出這些值。爲了公平起見,我應該補充一點,這非常接近純粹的理論,當然不推薦。它將與大多數典型實現一起工作,但標準不能保證它。這是一種愚蠢的,迂迴的方式來完成它的功能 - 但至少對於大多數典型的編譯器來說,無論如何它都是(只是幾乎不可能)。
關於note(1):選擇「C99 strict」看起來像傳遞* -std = c99 -pedantic -Werror * –