gpt4 book ai didi

c++ - 在命名空间中调用静态函数时出错

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:40 26 4
gpt4 key购买 nike

我收到以下错误:

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;
}
}

谁能解释一下原因?

最佳答案

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

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

  • foox.h 中的声明中移除 static 说明符,大​​概没有去那里的理由。
  • x.h 中定义 foo。请注意,这种方法会增加程序的大小,因为将为每个翻译单元制作函数的私有(private)拷贝。函数永远不要定义在 header 中带有内部链接,也就是说,当它们打算在所有程序中使用时。
  • main.cpp 中定义 foo。肯定不是你想要的。

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

有关详细信息,请阅读 this page .另外,请注意声明定义 之间的区别,这超出了这个问题的范围。

关于c++ - 在命名空间中调用静态函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25813177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com