联动期间的外部功能

时间:2014-11-27 14:15:07

标签: c linux

我的问题是这个问题的延续: extern function during linkage?

我现在在file2.c中尝试过:

extern int foo(void);

我打电话给

foo(1,2,3);

现在,我收到一个编译错误,其中包含太多参数     FOO(1,2,3);

为什么会这样?我们刚才说在连接过程中需要考虑外部功能,在那个阶段没有考虑参数...

2 个答案:

答案 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