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