2017-08-03 48 views
0

最近當我運行某些鐺實施過的gcc SPEC基準的,我發現,繼GCC規範的源代碼:規格GCC代碼; int main PARAMS((int argc,char ** argv));返回函數名define_as_parameter

int main PARAMS ((int argc, char **argv)); 

任何猜測什麼是真正從C編程的角度看意味着什麼?可能是什麼原因使用這個?

+0

它本身並不是有效的C,因此它不代表什麼。然而,很可能,所繪製的代碼將「PARAMS」定義爲一個宏。在這種情況下,它的含義取決於這個定義。 –

+1

相關:https://stackoverflow.com/questions/2607853/why-prototype-is-used-header-files – melpomene

+1

我沒有看到downvoting的原因,這是一件容易混淆初學者程序員的東西。參見[ansidecl.h](https://raw.githubusercontent.com/go-vgo/Mingw/master/include/ansidecl.h),搜索'PARAMS'查看推理和定義。 – Groo

回答

4

這是爲了與不支持函數原型的古代編譯器兼容。

現代編譯器接受:

int main (int argc, char **argv); 

古代那些需要:

​​

因此,爲了與可能不具有可變參數尚未預處理器支持,你可以這樣做:

#if __STDC__ 
/*all standard compliant compilers since the 1st version of the standard 
    must both define __STDC__ to a truthy value and support function prototypes*/ 
# define PARAMS(X) X 
#else 
# define PARAMS(X)() 
#endif 
/*...*/ 
int main PARAMS ((int argc, char **argv)); 
+2

一個經驗法則是,只要你看到雙括號,它表明宏將使用整個內部圓括號作爲「單一參數」,所以它通常用於爲不支持可變參數的編譯器提供支持。 – Groo

+0

我現在明白了,據我所知,函數名和參數之間沒有任何東西,這就是爲什麼我感到困惑。它實際上保持了這種語法,但是這裏的參數是整個部分:PARAMS((int argc,char ** argv)),它實際上是一個定義。 –

相關問題