最近當我運行某些鐺實施過的gcc SPEC基準的,我發現,繼GCC規範的源代碼:規格GCC代碼; int main PARAMS((int argc,char ** argv));返回函數名define_as_parameter
int main PARAMS ((int argc, char **argv));
任何猜測什麼是真正從C編程的角度看意味着什麼?可能是什麼原因使用這個?
最近當我運行某些鐺實施過的gcc SPEC基準的,我發現,繼GCC規範的源代碼:規格GCC代碼; int main PARAMS((int argc,char ** argv));返回函數名define_as_parameter
int main PARAMS ((int argc, char **argv));
任何猜測什麼是真正從C編程的角度看意味着什麼?可能是什麼原因使用這個?
這是爲了與不支持函數原型的古代編譯器兼容。
現代編譯器接受:
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));
一個經驗法則是,只要你看到雙括號,它表明宏將使用整個內部圓括號作爲「單一參數」,所以它通常用於爲不支持可變參數的編譯器提供支持。 – Groo
我現在明白了,據我所知,函數名和參數之間沒有任何東西,這就是爲什麼我感到困惑。它實際上保持了這種語法,但是這裏的參數是整個部分:PARAMS((int argc,char ** argv)),它實際上是一個定義。 –
它本身並不是有效的C,因此它不代表什麼。然而,很可能,所繪製的代碼將「PARAMS」定義爲一個宏。在這種情況下,它的含義取決於這個定義。 –
相關:https://stackoverflow.com/questions/2607853/why-prototype-is-used-header-files – melpomene
我沒有看到downvoting的原因,這是一件容易混淆初學者程序員的東西。參見[ansidecl.h](https://raw.githubusercontent.com/go-vgo/Mingw/master/include/ansidecl.h),搜索'PARAMS'查看推理和定義。 – Groo