2014-10-01 186 views
3

之间的变量我下载了一段C代码,它使用这种风格的定义函数:括号和大括号

int somefunction(name1, name2) 
int name1; 
int name2; 
{ 
    // do stuff, using name1 and name2 
} 

为什么或当您将使用此语法,和它与更多的有什么区别众所周知的语法,其中参数类型在括号内?

+0

请参阅[这个老问题](http://stackoverflow.com/q/3092006/440558)。 – 2014-10-01 14:17:37

+0

我认为[ANSI C函数声明如何改进旧的Kernighan和Ritchie风格?](http://stackoverflow.com/questions/14243959/)是一个很好的参考 - 也许是一个使这个重复的。关于这个符号也可能有更早的问题。 – 2014-10-01 14:32:11

回答

5

这是用于定义函数的非常古老的,预标准的C语法 - 在Kernighan和Ritchie编写“The C Programming Language”一书之后,也被称为K & R表示法。这是C89/C90的必要条件 - 标准增加了新的函数声明原型,但现有的代码没有使用它(因为早在1989年,许多编译器都不支持,而且编写的代码很少使用它) 。您应该只能找到代码中的符号,这些代码在二十多年内未被修改,或者仍然声称需要支持预标准编译器(这种声明至多可疑)。

不要使用它!如果你看到它,请更新它(仔细)。你还可以这样写任何的

注:

somefunction(name1, name2) 
{ 
    // do stuff, using name1 and name2 
} 

int somefunction(name1, name2) 
int name2; 
int name1; 
{ 
    // do stuff, using name1 and name2 
} 

int somefunction(name1, name2) 
int name1; 
{ 
    // do stuff, using name1 and name2 
} 

而且毫无疑问的其他变体也。如果省略了返回类型,则假定为int。如果省略参数类型,则假定为int。左括号和大括号之间的类型规范不必与括号列表中的参数名称的顺序相同;列表中的顺序控制参数的顺序。\

+0

谢谢。代码确实很旧(1998年),但工作正常,编译没有警告与海湾合作委员会3.3.2。 – 2014-10-01 14:40:05

+0

如果不引发它们并使用C89模式(它仍然是默认设置),它将在没有警告的情况下使用GCC 4.9.1进行编译。我建议代码应该升级,因为这种定义形式已经过时(不赞成使用),并且会在某个时候从标准中删除,但事实上它在十年或两年内仍然是安全的。 – 2014-10-01 14:44:58