升级Xcode 9.3后出现‘宏展开产生defined未定义行为’警告求助
解决Xcode 9.3中"Macro expansion producing 'defined' has undefined behavior"警告的方案
刚升级到Xcode 9.3就碰到这个烦人的警告?我之前也踩过这个坑,给你几个靠谱的解决办法:
核心原因
Xcode 9.3搭载的Clang编译器对预处理器宏的检查变得更严格了——当你直接用#if 宏名这种写法时,预处理器会自动把它展开成defined(宏名),但这种隐式展开在C标准里属于未定义行为,所以触发了警告。
具体解决办法
1. 显式使用defined()进行判断
把原来的隐式判断改成显式的宏定义检查,这是最规范的写法,也能彻底解决警告:
原来的代码:
#if MIXPANEL_FLUSH_IMMEDIATELY [self flush]; #endif
修改后:
#if defined(MIXPANEL_FLUSH_IMMEDIATELY) && MIXPANEL_FLUSH_IMMEDIATELY [self flush]; #endif
同理,另一段代码:
原来的:
#if !MIXPANEL_NO_AUTOMATIC_EVENTS_SUPPORT - (void)setValidationEnabled:(BOOL)validationEnabled { _validationEnabled = validationEnabled; ... } #endif
修改后:
#if !defined(MIXPANEL_NO_AUTOMATIC_EVENTS_SUPPORT) || !MIXPANEL_NO_AUTOMATIC_EVENTS_SUPPORT - (void)setValidationEnabled:(BOOL)validationEnabled { _validationEnabled = validationEnabled; ... } #endif
(如果你的宏只是用来做"是否定义"的开关,直接写#if defined(MIXPANEL_FLUSH_IMMEDIATELY)即可,根据实际需求调整)
2. 给宏添加默认定义
在项目的前缀头文件(比如YourProject-Prefix.pch)或者相关配置头文件里,给这些宏加上默认值,确保它们始终有明确的定义:
// 给MIXPANEL_FLUSH_IMMEDIATELY设置默认关闭状态 #ifndef MIXPANEL_FLUSH_IMMEDIATELY #define MIXPANEL_FLUSH_IMMEDIATELY 0 #endif // 给MIXPANEL_NO_AUTOMATIC_EVENTS_SUPPORT设置默认开启自动事件支持 #ifndef MIXPANEL_NO_AUTOMATIC_EVENTS_SUPPORT #define MIXPANEL_NO_AUTOMATIC_EVENTS_SUPPORT 0 #endif
这样不管你有没有在其他地方定义这些宏,预处理器都能拿到明确的值,不会触发隐式展开的警告。
3. 临时关闭该警告(不推荐)
如果暂时来不及修改代码,可以先通过Xcode的Build Settings关闭这个特定警告:
- 打开项目的Build Settings
- 搜索
Other C Flags - 添加
-Wno-expansion-to-defined
这个方法只是应急用的,长期来看还是建议修改代码写法,避免潜在的预处理器问题。
内容的提问来源于stack exchange,提问作者Yuchen
相关产品推荐
相关产品推荐

