簡體   English   中英

C main()函數可以是靜態的嗎?

[英]Can the C main() function be static?

main()函數可以在C程序中聲明為static嗎? 如果是的話那么它的用途是什么?

是否可以使用匯編代碼並自己調用static main()函數(考慮嵌入式程序)?

不,C規范實際上在其中的某個地方(我讀了規范,不管你信不信),主要功能不能是靜態的。

原因是靜態意味着“不要讓這個源文件之外的任何東西使用這個對象”。 好處是當你去鏈接時它可以防止C中的名稱沖突(如果你有兩個全局變量在不同的文件中被命名為“is_initialized”,那將是非常糟糕的......它們會被默默地合並,除非你制作它們靜態的)。 它還允許編譯器執行某些優化,否則它將無法執行。 這兩個原因是為什么靜態是一件好事。

由於您無法從文件外部訪問靜態函數,因此操作系統如何能夠訪問主函數來啟動程序? 這就是為什么主要不能是靜態的。

有些編譯器特別對待“main”,並且在聲明靜態時可能會默默地忽略它。

編輯:看起來我錯了,規格說主要不能是靜態的,但它確實說它不能在托管環境中內聯(如果你不得不問“托管環境”意味着什么,那么你就是在一個)。 但是在OS X和Linux上,如果你聲明main static,那么你會得到一個鏈接錯誤,因為鏈接器找不到“main”的定義。

你可以有一個叫做靜態函數main()的源文件,它可能會編譯,但它不會成為 main()函數,因為它是不可見的鏈接時,啟動代碼(上的crt0.o許多(較舊的)Unix系統)調用main()

鑒於代碼:

static int main(int argc, char **argv)
{
    return(argv + argc);
}

extern int x(int argc, char **argv)
{
    return(main(argc, argv));
}

海灣合作委員會與-Wall有幫助地說:

 warning: 'main' is normally a non-static function

是的,可以做到。 不,這通常是一個錯誤-這不是 main()函數。

不,你做不到。 如果你這樣做,你將無法編譯你的程序。 因為靜態函數只能在同一個文件中可見,所以鏈接器將無法找到它並調用它。

正如其他人所說,不,它不能。 如果您打算將代碼移植到C ++,那么這會變得更加復雜,因為C ++標准指定main()實際上不需要是函數。

C對“靜態”有兩個含義......

局部變量的靜態意味着它可以全局使用。 全局變量的靜態意味着只能在當前文件中使用。

函數的靜態與將全局變量表示為靜態具有完全相同的影響...靜態函數僅在當前文件中可見...

因此,main永遠不會是靜態的,因為它不能作為程序的主要入口點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM