在初始化器列表中使用#Define

Using #define inside initializer list

本文关键字:#Define 列表 初始化      更新时间:2023-10-16

最近我遇到了与此相似的一块代码

std::map<size_t,std::string> map{
#define RT_OK 0
    {RT_OK,"No Error"},
#define RT_SIZE_MISMATCH 1
    {RT_SIZE_MISMATCH,"Size Mismatch"}
};

在初始化器列表中使用#define

我真的很惊讶它与GCC合作,并且似乎也与Clang合作。无论如何,可以在初始化列表中使用#define吗?

是" ok" 1 将宏定义放置在任何地方 2

预处理前指令由预处理器删除。编译器看到类似:

std::map<size_t,std::string> map{
// there was a PP directive here
    {0,"No Error"},
// there was a PP directive here
    {1,"Size Mismatch"}
};

1 从某种意义上说,程序已正确。有时可能不行,因为它可能会使其他程序员感到困惑。

2 适用限制。在指令之前,不得在同一行上有任何非Whitespace令牌,该指令一直持续到行结束为止。