[英]extern function during linkage
我的问题是这一个问题的延续: 链接期间的外部函数?
我现在在file2.c中尝试过:
extern int foo(void);
然后我打电话
foo(1,2,3);
现在,我收到一个编译错误,即foo(1,2,3)中的参数过多;
为什么会这样呢? 我们只是说过,在链接过程中会寻找外部函数,并且在那个阶段没有考虑参数...
在链接过程中会寻找
extern
函数,并且在此阶段中无需考虑参数。
没错 但是,您在编译阶段而不是在链接阶段会遇到错误。 您向编译器保证了有一个不带参数的函数foo
,然后用三个参数调用foo
。 编译器不接受该错误,并报告错误。
链接器忽略参数的问题是,如果单独编译具有零参数的foo
,并使用具有三个参数的不匹配原型对foo
进行调用。 这是未定义的行为。
隐含的
void foo() {}
main.c
void foo(int,int,int);
int main(int argc, char *argv[]) {
foo(1, 2, 3);
return 0;
}
如果编译上面的代码,它将链接,因为您通过给编译器提供了错误的原型来欺骗了编译器,并且链接器对此一无所知。
通过说extern int foo(void);
,您要告诉编译器在链接时查找函数定义。 在此过程中,您已经在提供函数原型[declaration] int foo(void);
,其中参数数为0。
但是,在使用时,您正在调用foo(1,2,3);
,因此发生了编译错误。
注意:如果我没记错的话,默认情况下,函数声明是extern
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.