【问题标题】:Variables between parentheses and curly braces [duplicate]括号和花括号之间的变量[重复]
【发布时间】:2014-11-26 10:02:21
【问题描述】:

我下载了一段 C 代码,它使用这种定义函数的方式:

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

您为什么或何时使用此语法,它与参数类型位于括号内的更广为人知的语法有何不同?

【问题讨论】:

标签: c function syntax


【解决方案1】:

这是用于定义函数的非常古老的、预标准的 C 语法——在 Kernighan 和 Ritchie 写了“C 编程语言”一书之后也被称为 K&R 表示法。 C89/C90 必须允许它——标准添加了新的函数声明原型形式,但现有代码没有使用它(因为早在 1989 年,许多编译器不支持,并且编写的代码很少使用它) .您应该只在超过 20 年未修改的代码中找到该符号,或者仍然声称需要支持预标准编译器(这样的声明充其量是可疑的)。

不要使用它!如果您看到它,请更新它(小心)。

请注意,您也可以编写以下任何内容:

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。右括号和左括号之间的类型说明不必与括号列表中的参数名称的顺序相同;列表中的顺序控制了参数的顺序。

【讨论】:

  • 谢谢。该代码确实很旧(1998 年),但可以正常工作并且使用 gcc 3.3.2 编译时不会出现警告。
  • 如果您不引出它们并使用 C89 模式(这仍然是默认设置),它将与 GCC 4.9.1 一起编译而不会发出警告。我建议应该升级代码,因为这种定义形式已经过时(不推荐使用)并且会在某个时候从标准中删除,但实际上它在十年或两年内仍然是安全的。
猜你喜欢
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 2014-05-31
  • 2019-01-26
  • 2019-02-16
相关资源
最近更新 更多