函数声明和大括号之间的C语句
可能重复:
这个C语法的用处是什么?
定义中函数标题后的C变量声明
奇怪的C语法是什么?
我正在尝试理解一些代码,它具有以下内容:
int getr(fget) FILE *fget; { /* More declarations and statements here */ return (1); }
以上和之间有什么区别:
int getr(fget) { FILE *fget; /* More declarations and statements here */ return (1); }
如果是这样,他们有什么不同?
这两个函数都以旧式(非原型)forms声明。 旧式函数声明在当前的C标准中已经过时,C标准强烈建议不要使用它们。
在第二种forms中,没有提到假定为int
的fget
参数类型。 然后声明另一个类型为FILE *
对象fget
,它会使用相同名称隐藏参数变量。
使用gcc
-Wshadow
警告选项会在第二个示例中向您发出警告,因为参数的阴影:
-Wshadow Warn whenever a local variable shadows another local variable, parameter or global variable or whenever a built-in function is shadowed.
第一个是K&R风格的function定义 ,它是一个过时的functionRef 1 。
第二种通常被称为c99标准之前的隐式int特征。
在c99之前如果函数没有返回显式类型或者没有在声明中指定类型,则假定该类型为int
。
这两种方法都已被弃用,并在c99标准中找到了提及。
参考文献:
C99标准:前言第7段:
第二版的主要变化包括:
– 删除隐式int
– 删除隐式函数声明
参考1
6.11.7函数定义
使用具有单独的参数标识符和声明列表(而不是原型格式参数类型和标识符声明符)的函数定义是一个过时的function。