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

时间:2019-05-02 00:52:18

标签: c++

最近我在这里遇到了一段与此代码相似的代码

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吗?

1 个答案:

答案 0 :(得分:2)

将宏定义放在任何地方 2 是“确定” 1

预处理器指令被预处理器删除。编译器会看到类似的内容:

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 受限制。伪指令前的同一行中不得有任何非空白标记,伪指令将持续到该行的末尾。