You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存在同名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:12:45