2014-09-29 75 views
0

中的程序啓動,我有幾個有關標準§5.1.2.2.2的問題。關於標準

  1. 稱爲在程序啓動的功能被命名爲主要。該實現沒有聲明這個函數的原型。它應具有的INT返回類型和不帶參數 定義:

    int main(void) { /* ... */ }

    或兩個參數(這裏稱爲 ARGCargv的,雖然任何名稱可能是使用的,因爲它們是地方在聲明它們的 功能):

    int main(int argc, char *argv[]) { /* ... */ }

    或同等學歷; 10)或其他一些 實現定義的方式。

什麼是「其他一些實現定義的方式」是指什麼?它提及腳註10,其中指出:

因此,INT可以通過定義爲INT,或 的的argv類型可以寫爲炭typedef名稱來代替** argv,等等。

...還是主要的實際定義?如果是這樣,這是否意味着給定了某種實現方式,編譯器可以說main應該被定義,然而它想要的(這與我在互聯網上讀到的說法相反,它必須是int main。例如,在§5.1.2.2 .3規定:

  1. 如果主要函數的返回類型與INT兼容的類型,從最初的調用主要功能的回報相當於 於調用退出函數返回的值爲t他主要 作爲其論點; 11)到達}終止了 函數如果返回類型不與INT兼容 返回0的值,則終止狀態返回到主機環境是 未指定的。

......這似乎給實施留下了很大的餘地。

- 參數的argc的argv和琴絃指向 的的argv陣列應被程序是可修改的,和保留程序啓動和程序 終止之間 其最後存儲的值。

「保留其最後存儲的值是什麼意思」?這是否意味着像getopt這樣的函數違反了標準,因爲它們排列了argv?

回答

1

否;這意味着Microsoft可以記錄:

void main(int argc, char **argv, char **envp) 

作爲main()他們系統上的有效簽名,它是有效的作爲的結果「或在一些其它實現定義的方式」。

的腳註意味着你可以使用:

typedef int num; 

num main(num argc, char **argv) 

,它仍然有效。請參閱What should main() return in C and C++

「最後修改的值」位是指當getopt()的置換中argv的數值,排列它集住宿有效,直到被其他東西改變argv值覆蓋。

2

「一些其他實現定義的方式」是指什麼?

C標準只提供了兩個簽名爲main

int main(void) { /* ... */ } 
int main(int argc, char *argv[]) { /* ... */ } 

但是,一些實現還允許一些不同的簽名。

在Mac OS:

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

在Windows上:

int wmain(int argc, wchar_t* argv[], wchar_t* envp[]); 

POSIX支持

int main(int argc, char *argv[], char *envp[])