问我的编译器抱怨说函数被无效地重新声明了,但我只定义了一次并且只调用了一次。
答在作用域内未声明就被调用的函数,也许是因为第一次调用发生在函数定义之前,会被假定为通过以下方式声明:
extern int f();也就是说,一个未声明的函数被假定返回int,并且接受不确定数量的参数(尽管参数必须是固定数量的,并且没有一个是“窄”的)。如果函数后来以不同的方式定义,编译器会抱怨这种差异。返回非int的函数,或接受任何“窄”参数,或接受可变数量参数的函数,都必须在调用它们之前声明。(并且,声明所有函数是最安全的,这样函数原型就可以检查参数是否正确传递。)
问题的另一个可能来源是,该函数与某个头文件中声明的另一个函数同名。
参考:K&R1 第 4.2 节,第 70 页
K&R2 第 4.2 节,第 72 页
ISO 第 6.3.2.2 节
H&S 第 4.7 节,第 101 页