在“)”之后定义函数的参数类型,它是一个非常古老的标准吗?

我正在读一本关于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 。 这是默认值。