2017-08-03 77 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)),它实际上是一个定义。 –