存在同名DELETE宏时,如何为C++枚举添加DELETE标识符?
解决C++枚举类添加DELETE值与winnt.h宏冲突的问题
遇到这种宏和枚举名冲突的情况,核心是让预处理器在处理你的枚举类时,别把DELETE当成宏替换掉,同时尽量不影响现有代码和后续对winnt.h宏的使用,下面给你几个可行的方案:
方案一:直接取消DELETE宏定义(简单直接)
如果你的代码里不需要用到winnt.h中定义的DELETE宏,可以在包含winnt.h之后立刻取消这个宏的定义,这样枚举类里的DELETE就能正常作为标识符使用了:
#include <winnt.h> #undef DELETE // 清除宏定义 enum class Method { GET, POST, PUT, HEAD, DELETE // 此时不再被预处理器替换,编译正常 };
方案二:临时取消宏,用完恢复(更安全)
如果后续代码还需要用到winnt.h的DELETE宏,就用#pragma push_macro和#pragma pop_macro来临时保存并恢复宏定义,避免影响其他代码:
#include <winnt.h> // 先保存当前DELETE宏的内容 #pragma push_macro("DELETE") #undef DELETE // 临时取消宏 enum class Method { GET, POST, PUT, HEAD, DELETE }; // 恢复之前的DELETE宏,不影响后续使用 #pragma pop_macro("DELETE")
为什么会报错?
winnt.h里的#define DELETE (0x00010000L)是预处理器宏,编译前预处理器会把代码里所有的DELETE替换成(0x00010000L),导致你的枚举类变成:
enum class Method { GET, POST, PUT, HEAD, (0x00010000L) // 这显然不是合法的标识符,所以报"expected an identifier" };
这两个方案都不需要修改现有使用Method::DELETE的字符串转换代码,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Jasmeet
相关产品推荐
相关产品推荐

