2016-04-09 64 views
4

我一直在想很多關於最簡單的方式來最低限度地表達C中的主要功能(是的,它是微不足道的,通常不感興趣,但這對我很有意思)。是否有任何問題與主要定義爲int main(...){}

很長一段時間,爲了這一天,我喜歡定義主要如下:

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

我對這個問題,我通常不會使用這些參數,所以它使論點明確,即使我在代碼中不要太在意他們寫出來。

於是我開始做

int main() 
{ 
    return 0; 
} 

這是誠實的,因爲它沒有明確地說,函數沒有參數,如許多int main(void){}定義做了,我很滿意。

但是,我只是有一個想法,使用主的可變參數定義使得主的定義對我來說更加舒適,因爲它「看起來」對我來說好像函數確實有參數,但我不關心它們是正確的現在。

int main(...) 
{ 
    return 0; 
} 

這樣濫用符號...有什麼問題嗎?也就是說,......意味着用於模式的函數(可以推導出以下參數的個數的參數,...)。而這個主要不適合這種模式,並在技術上是濫用符號。

我理解符號會誤導其他讀者(...有些先進的概念,並且被濫用會使其更具誤導性),並且在共享代碼時我仍然更喜歡其他原型。我只是很好奇C是否有效。

我的問題是:

  1. 主要是便攜式的可變參數的定義或者是有可能,一些編譯器會不喜歡它。

  2. 做這種定義通常是可以的,或者是這樣做的運行時/編譯時結果?

+7

對'(void)'和'(int,char **)'以外的簽名的支持是由實現定義的,因此請諮詢您的供應商。代碼將不可移植。 –

+1

你嘗試過'int main(...)'嗎?如果你的編譯器接受它是有效的,那麼你使用的是什麼編譯器? – user3386109

+0

@ user3386109「g ++(Debian 4.7.2-5)4.7.2」和 「Debian clang version 3.0-6.2(tags/RELEASE_30/final)(based on LLVM 3.0)」 – Dmitry

回答

4

不,那就是絕對是不對。

這是錯誤的,因爲它是無效的語法。從n1548節6.7.6:

parameter-type-list: 
    parameter-list 
    parameter-list , ... 
parameter-list: 
    parameter-declaration 
    parameter-list , parameter-declaration 

按照C標準,如果你在函數參數使用...,你必須收到至少一個其他參數。其他都是無效的C.你可以從語法中看到...只能出現在逗號,參數列表參數列表不能爲空。

您的編譯器可能會接受它,但這並不意味着太多。編譯器接受很多C無效的東西,並且很樂意編譯它們。

+1

我撒謊,我的例子實際上並沒有編譯爲C,而是C++。正如你所說的那樣,它是無效的C語法,並且產生一個錯誤:ISO C在'...'前需要一個命名參數。當使用.cpp擴展名進行編譯時,不會出現這種情況,我之所以這樣做是出於實驗原因。 – Dmitry

1

你的前兩個版本都很好。使用符合您需求的任何一種。

int main(...)對這個函數不會有很好的簽名,雖然它是有效的!

...表示該函數接受可變數量的未指定類型的參數。以printf()爲例。它接受一個格式字符串之後的任何類型的零個或多個參數,其功能簽名反映了這一點:

int printf(const char* format, ...) 

main功能是不是這樣的。它接收特定類型的參數的特定列表,而不是具有必須在運行時確定的類型的可變數目的參數。

傳統,main了在你的第一個例子中所示的兩個參數:

int main(int argc, char **argv) 

當然,你可以通過不使用它們忽略這些參數,或者通過定義主要在你的第二個例子:int main()

取決於編譯器/運行時,main可能需要第三個參數包含環境變量:

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

它甚至可能需要第四個參數上OSX:

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

但在所有這些案件,你有特定類型的具體論點。 main不像printf - 它永遠不會需要一個真正的變量不確定類型的參數數量。所以main(...)不是一個合適的簽名。

+0

這不完全正確。 C的不同實現應該有額外的env參數。它需要有前兩個參數(雙字,指針)。 – Dmitry

+1

此外,如果該函數沒有至少一個命名參數,則不能使用可變參數。 –

+0

@KerrekSB我在我的OP中提到過這個。這就是爲什麼我問,這是一個濫用符號,只是一個引人注目的。濫用符號如果它是一致的和理解的,我們一直這樣做是可以的。問題在於,除了讓人困惑之外,這種做法是否存在固有的不可移植/進一步的後果(這並不好,所以我仍然不會以這種形式向其他人展示)。 – Dmitry

相關問題