![](/img/trans.png)
[英]Are there valid reasons to declare variables static inside the main() function of a C program?
[英]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.