gpt4 book ai didi

c++ - constexpr 静态数据成员给出 undefined reference 错误

转载 作者:太空狗 更新时间:2023-10-29 20:12:45 26 4
gpt4 key购买 nike

我在内核上工作,我想使我的静态数据成员 constexpr 这样我就可以在 enum 类 中拥有它的值。但是,如果我这样做,我会得到一个 undefined reference 错误。它似乎只有在我将其设为非 constexpr 并在类外对其进行初始化时才有效。

工作:

// terminal.hpp
class Terminal
{
static uint32_t col_map[16];
};

// terminal.cpp
uint32_t Terminal::col_map[16] = {
0x000000, 0x0000AA, 0x00AA00, 0x00AAAA,
0xAA0000, 0xAA00AA, 0xAA5500, 0xAAAAAA,
0x555555, 0x5555FF, 0x55FF55, 0x55FFFF,
0xFF5555, 0xFF55FF, 0xFFFF55, 0xFFFFFF
};

不工作:

// terminal.hpp
class Terminal
{
constexpr static uint32_t col_map[16] = {
0x000000, 0x0000AA, 0x00AA00, 0x00AAAA,
0xAA0000, 0xAA00AA, 0xAA5500, 0xAAAAAA,
0x555555, 0x5555FF, 0x55FF55, 0x55FFFF,
0xFF5555, 0xFF55FF, 0xFFFF55, 0xFFFFFF
};

enum class Color : uint32_t
{
Black = col_map[0],
White = col_map[15]
};
};

请注意,我试图在常规编译器上重现此错误,但未成功,因此我认为它与内核或交叉编译器有关。

链接器错误:

terminal.o: In function `Terminal::drawcolormap()':
terminal.cpp:(.text+0x6f): undefined reference to `Terminal::col_map'

我总是运行make clean;制作

最佳答案

静态数据成员如果是 odr-used 则应在类外定义---句点。这条规则没有异常(exception)。

在数据成员是constexpr 的情况下,它还必须在类定义内部 中初始化。然而,这并没有取消在类外定义它的要求。

正确的代码:

class Terminal
{
constexpr static uint32_t col_map[16] = { /* ... */ };
// ...
};
constexpr uint32_t Terminal::col_map[16]; // definition

这是违反直觉的,但事实就是如此。

关于c++ - constexpr 静态数据成员给出 undefined reference 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25830111/

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