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

#define X defined(Y) 是否为有效的C/C++宏定义?

关于#define X defined(Y)的有效性问题

这种写法在C标准中属于未定义行为,但不少主流编译器会将其作为扩展特性支持,所以你才会看到它能正常运行。

  • 标准C的规则限制:defined是预处理专用运算符,标准明确规定它只能出现在#if或#elif的条件表达式中,不能直接放在#define的替换文本里。
  • 编译器扩展的支持:GCC、Clang、MSVC等常用编译器都提供了扩展,允许将defined的结果通过宏定义保存。预处理时,编译器会先展开宏,再处理defined运算符,所以你的示例代码能正常工作。
  • 你给出的示例代码作用:先把WIN_PLAT定义为defined(_WIN32),接着通过#if判断该表达式的真假,再将WIN_PLAT重新定义为1或0,最终得到一个可直接作为数值使用的宏(比如在代码中写if (WIN_PLAT)),而不是只能用于预处理条件判断。
  • 可移植性提醒:这种写法不具备跨编译器的可移植性,若使用严格遵循标准的编译器,可能会触发编译错误。标准兼容的写法应该直接在#if中判断:
#if defined(_WIN32)
#define WIN_PLAT 1
#else
#define WIN_PLAT 0
#endif

内容的提问来源于stack exchange,提问作者Lucas Orlandi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:22:04