我的问题是这个问题的延续: extern function during linkage?
我现在在file2.c中尝试过:
extern int foo(void);
我打电话给
foo(1,2,3);
现在,我收到一个编译错误,其中包含太多参数 FOO(1,2,3);
为什么会这样?我们刚才说在连接过程中需要考虑外部功能,在那个阶段没有考虑参数...
答案 0 :(得分:2)
在链接期间查找
extern
函数,并且在该阶段不考虑参数。
这是完全正确的。但是,在编译阶段会出现错误,而不是在链接阶段。您向编译器承诺存在不带参数的函数foo
,然后使用三个参数调用foo
。编译器不接受,并报告错误。
链接器忽略参数的问题是,如果您使用零参数单独编译foo
并使用带有三个参数的非匹配原型调用foo
。这是未定义的行为。
impl.c
void foo() {}
的main.c
void foo(int,int,int);
int main(int argc, char *argv[]) {
foo(1, 2, 3);
return 0;
}
如果你编译上面的内容,它会链接,因为你通过给它一个错误的原型来欺骗编译器,并且链接器不知道更好。
答案 1 :(得分:0)
通过说extern int foo(void);
,你告诉编译器在链接时寻找函数定义。在这个过程中,您已经提供了函数原型[declaration] int foo(void);
,其中参数的数量为0。
但是,在使用时,您正在调用foo(1,2,3);
,因此发生了编译错误。
注意:如果我没有弄错,函数声明默认为extern
。