在命名空间中调用静态函数时出错
Error in calling a static function in a namespace
我得到以下错误:
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
的函数的链接是内部的,这意味着它只能从当前翻译单元引用。即使多个翻译单元看到相同的声明,每个翻译单元也需要一个函数的私有版本。
在您的情况下,在x.cpp中定义的函数foo对其他翻译单元不可用。当编译器翻译main.cpp时,它会将符号注释为"丢失",但不会抱怨。稍后,在链接阶段,链接器无法找到对象main中引用的private函数foo。要解决这个问题,您可以:
-
从x.h中的
foo
声明中删除static
说明符,这可能没有理由 - 在x.h中定义foo。请注意,这种方法会增加程序的大小,因为每个翻译单元都会生成函数的私有副本。函数不应被定义为在标头中具有内部链接,也就是说,当它们打算在所有程序中使用时
- 在main.cpp中定义foo。当然不是你想要的
正确的解决方案当然是第一个。对其他人进行了解释以说明原因。
有关详细信息,请阅读本页。此外,请注意声明和定义之间的差异,这不在本问题的范围内。
您必须在标头中定义静态函数(在本例中,删除X.cpp中的定义),或者在main.cpp中额外定义静态函数。否则,main.cpp将看不到其定义。在X.cpp中,定义了另一个具有相同名称的静态函数foo。静态功能没有外部链接。它们具有内部联系,应在使用它们的汇编单元中进行定义。
因此X.cpp有它自己定义的静态函数foo。但main.cpp并没有定义自己的名为foo的静态函数。它只是由于包含了头而声明了它。
相关文章:
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 如何在静态函数中使用成员函数数组
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++无法访问或使用静态函数
- 如何将 cpp 文件中的静态函数公开给其他文件
- 使用匿名命名空间中的函数或另一个文件中的静态函数不应该出错吗?
- 将非静态函数作为参数传递时出错
- 在C++中使用静态和静态函数时出错
- 在命名空间中调用静态函数时出错
- 使用std::unique_ptr的静态函数deleter时出错