gpt4 book ai didi

c++ - 为什么在头文件中声明 "static const"成员会导致链接器错误?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:46 24 4
gpt4 key购买 nike

我有一个这样的类声明(.h 文件):

struct MyClass {
static const uint32_t SIZE = sizeof(MyType);
};

将我的程序链接在一起时,出现 MyClass::SIZE 的链接器错误。 nm 确认符号未定义。 http://forums.devshed.com/c-programming-42/linker-errors-undefined-reference-to-static-member-data-193010.html似乎解决了我的问题,表明“类静态对象也必须像普通全局变量一样在任何函数或类之外声明。”

我有两个问题:

  1. 这个解释对我的情况有效吗?如果是这样,您能否更详细地解释为什么这是真的?
  2. 修复它的最佳方法是什么?我想将此成员的初始化完全保留在 .h 文件中。

最佳答案

您的问题可能与有人获取您变量的地址无关。它可能只是编译器选择不将变量用作常量表达式,即使它可以。例如:

f(int const&);
struct X { enum { enum_val = 42 }; static int const static_mem = 42; };

f(5);
f(X::enum_val);
f(X::static_mem);

在前两种情况下,编译器需要将输入用作常量表达式,并且 const& 可以用这样的方式进行初始化。然而,最后一种情况不同。尽管您的意图可能是将 static_mem 用作常量表达式,并且这样做是完全合法的,但编译器可以自由地做其他事情,有些编译器实际上会创建对变量本身的引用。这是变量的“使用”,因此您需要在程序的某处定义该变量。

有两种方法可以解决这个问题:

1) 为您的程序添加一个定义。

2) 改为使用枚举: 结构 X { 枚举 { static_mem = ? }; };

如果您确实打算获取变量的地址,那么第一个解决方案是必要的。很可能您没有创建该定义,或者您已经创建了该定义。后面的解决方案强制编译器使用 X::static_mem 作为常量表达式,因为枚举成员实际上并不作为程序中的对象存在。根据您在问题中的最后陈述,我敢打赌这是您真正想要的解决方案。

关于c++ - 为什么在头文件中声明 "static const"成员会导致链接器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5183703/

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