繁体   English   中英

链接期间的外部功能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM