在“)”之后定义函数的参数类型,它是一个非常古老的标准吗?
我正在读一本关于C代码混淆的旧书(该书于1993年出版),我注意到带参数的函数是以这种方式实现的:
real_dump(address, infunc, ofp) char *address; int (*infunc)(); FILE *ofp; { /* the code goes here... */ }
此外,没有定义返回类型。
这是旧标准吗? 是否可以启用gcc来编译此代码?
非原型forms的函数定义是有效的C89,C99和C11代码。
它被称为旧式函数定义,但此function在C89之后被标记为过时function。
此表格不应在新计划中使用。
C99理由说:
“将陈旧的风格描述为过时是为了阻止它的使用,并作为委员会对新风格的强烈支持。”
甚至K&R2都不鼓励使用它:
“旧的声明和定义仍然适用于ANSI C,至少在过渡期内,但我们强烈建议您在拥有支持它的编译器时使用新表单。”
现在你的函数也没有返回类型,并且在函数声明或函数定义中省略返回类型从C99起不再有效。 在C99之前,没有返回类型的函数隐含地返回int
。
关于gcc
问题,默认情况下gcc
使用-std=gnu89
编译。 这意味着C89标准+ gcc扩展。 因此,默认情况下, gcc
将接受使用旧式表单中的函数声明和定义编译程序,而不使用返回类型。
哎呀,这是用于定义函数的ANSI C之前的方法,我真的不建议在“普通”代码中使用这种语法。 尽管如此,gcc似乎毫无问题地接受它(它仍然在标准中,尽管在§6.11.7中被标记为“过时”)。
(顺便说一下,对于“缺失”的返回类型,应该应用“隐式int
规则”)
这是Kernighan和Ritchie风格的函数声明。 K&R C先于ANSI C,后者添加了现在最常用的C ++风格函数原型。
缺少返回类型意味着返回类型为int
。 这是默认值。