【问题标题】:Error in calling a static function in a namespace在命名空间中调用静态函数时出错
【发布时间】:2014-09-12 16:54:51
【问题描述】:

我收到以下错误:

x.h:3:13: warning: ‘int X::foo()’ used but never defined
/tmp/ccK9qSnq.o: In function `main': main.cpp:(.text+0x7): undefined reference to `X::foo()'
collect2: error: ld returned 1 exit status

在构建以下代码时:

main.cpp

#include "x.h"

int main()
{
    X::foo();
}

x.h

namespace X
{
    static int foo();
}

x.cpp

#include "x.h"

namespace X
{
    int foo()
    {
        return 1;
    }
}

谁能解释原因?

【问题讨论】:

  • 它是静态的。也许您打算让它成为extern(默认情况下哪些功能)? static 用于全局函数/变量意味着“没有其他源文件可以看到/使用这个函数/变量”。 I once wrote a mediocre blog post on what static means.
  • static 有很多含义,具体取决于上下文,我想你在这里不需要它。

标签: c++ linkage


【解决方案1】:

声明static的函数的链接是内部的,这意味着它只能从当前翻译单元中引用。即使多个翻译单元看到相同的声明,也希望每个翻译单元都有一个私有版本的函数。

在您的情况下发生的情况是 x.cpp 中定义的函数 foo 对其他翻译单元不可用。当编译器翻译 main.cpp 时,它会将符号注释为“缺失”,但不会抱怨。后来,在链接阶段,链接器找不到对象main中引用的private函数foo。要解决这个问题,您可以:

  • x.hfoo 的声明中删除 static 说明符,这可能没有理由存在。
  • x.h 中定义 foo。请注意,这种方法会增加程序的大小,因为将为每个翻译单元制作函数的私有副本。函数应该从不定义在标题中使用内部链接,也就是说,当它们打算在所有程序中使用时。
  • main.cpp 中定义 foo。肯定不是你想要的。

正确的解决方案当然是第一个。解释了其他人以说明原因。

如需了解更多信息,请阅读this page。另外,请注意 declarationdefinition 之间的区别,这超出了本问题的范围。

【讨论】:

    【解决方案2】:

    您必须在头文件中定义静态函数(在这种情况下,删除它在 X.cpp 中的定义)或另外在 main.cpp 中。否则 main.cpp 将看不到它的定义。在 X.cpp 中定义了另一个同名的静态函数 foo。静态函数没有外部链接。它们具有内部链接,应在使用它们的编译单元中定义。

    所以 X.cpp 有它自己定义的静态函数 foo。 但是 main.cpp 并没有定义自己的静态函数,名称为 foo。它只是由于包含标题而声明的。

    【讨论】:

    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 2021-11-18
    • 2010-12-22
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多