2009年12月18日 星期五

void main

 
很久以前寫的..
久到幾乎忘了曾寫過一堆 void main..

void main() 為編譯器廠商自訂的簡便用法,
在不同 OS 與 compiler 上不具通用性。
許多早期的 C Compiler,無論是 void main()、int main()、或 main()
最後在組語符號表中的都是 _main,於是會發現在某些編譯器 (如 K&R) 上,
void main(), double main() 或是 int main[]= {0xcc} 也能順利編譯 :-)

( ) 中不加參數宣告時.. 多數編譯器視為 (void),
亦有視為不定參數者,不過那是陳年往事了,現在多不這麼做。
x86 系統上,最後執行 xor eax, eax,(接著 pop edi、esi、ebx,
回復 stack 後 ret) 將 0 放在 EAX 暫存器裡傳回給作業系統。

C89/C99 中規定 main 需指明傳回值,
因此新式、標準的編譯器不再支援 main () { ... } 的寫法。

main 可移植的正規寫法有 2 種:

    int main (void);
    int main (int argc, char *argv[]);

Platform-dependent 格式有 2 種:

(1) UNIX、DOS、Windows 可用:
    int main(int argc, char *argv[], char *envp[]);

(2) Mac OS X 與 Darwin 可用:
    int main(int argc, char *argv[], char *envp[], char *apple[]);

envp 中放的就是用 getenv 取出的環境變數。
各參數意義 google 上可查到許多介紹。

沒有留言:

張貼留言