规范GCC代码;int主参数((int argc,char**argv));返回函数\u name将\u定义为\u参数

规范GCC代码;int主参数((int argc,char**argv));返回函数\u name将\u定义为\u参数,c,gcc,C,Gcc,最近,当我在gcc规范基准上运行一些clang实现时,我在gcc规范源代码中发现: int main PARAMS ((int argc, char **argv)); 猜猜从c编程的角度看,这到底意味着什么?使用它的原因是什么?这是为了与不支持函数原型的古代编译器兼容 现代编译器接受: int main (int argc, char **argv); 古代人需要: int main (); 因此,要使用可能还没有可变参数的预处理器来支持这两种方法,可以执行以下操作: #if __STD

最近,当我在gcc规范基准上运行一些clang实现时,我在gcc规范源代码中发现:

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

猜猜从c编程的角度看,这到底意味着什么?使用它的原因是什么?

这是为了与不支持函数原型的古代编译器兼容

现代编译器接受:

int main (int argc, char **argv);
古代人需要:

int main ();
因此,要使用可能还没有可变参数的预处理器来支持这两种方法,可以执行以下操作:

#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));

这是为了与不支持函数原型的古代编译器兼容

现代编译器接受:

int main (int argc, char **argv);
古代人需要:

int main ();
因此,要使用可能还没有可变参数的预处理器来支持这两种方法,可以执行以下操作:

#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));

它本身不是有效的C,因此它没有任何意义。然而,从中提取的代码很可能将
PARAMS
定义为宏。在这种情况下,它的意思取决于这个定义。相关:我不明白为什么要投否决票,这很容易让初学者感到困惑。请参阅,搜索
PARAMS
以查看推理和定义。其本身可能重复,因此它不是有效的C,因此它没有任何意义。然而,从中提取的代码很可能将
PARAMS
定义为宏。在这种情况下,它的意思取决于这个定义。相关:我不明白为什么要投否决票,这很容易让初学者感到困惑。请参阅,搜索
PARAMS
以查看推理和定义。一条经验法则的可能重复之处在于,每当您看到双括号时,它指示宏将使用整个内括号作为“单个参数”,所以它经常被用来为不支持变量参数的编译器提供支持。我现在明白了,据我所知,函数名和参数之间不可能有任何区别,这就是为什么我感到困惑的原因。它实际上保持了这种语法,但这里的参数是整个部分:PARAMS((int argc,char**argv))实际上是一个define。一个经验法则是,每当看到双括号时,它指示宏将使用整个内括号作为“单个参数”,所以它经常被用来为不支持变量参数的编译器提供支持。我现在明白了,据我所知,函数名和参数之间不可能有任何区别,这就是为什么我感到困惑的原因。它实际上维护了该语法,但这里的参数是整个部分:PARAMS((int argc,char**argv)),它实际上是一个define。