产生“已定义”的宏扩展具有未定义的行为

Posted

技术标签:

【中文标题】产生“已定义”的宏扩展具有未定义的行为【英文标题】:Macro expansion producing 'defined' has undefined behavior 【发布时间】:2018-04-09 21:16:00 【问题描述】:

升级到 Xcode 9.3 后,我们开始看到很多这样的警告:

像这样:

#if MIXPANEL_FLUSH_IMMEDIATELY // ==> Warning: Macro expansion producing ...
    [self flush];
#endif

还有这个:

#if !MIXPANEL_NO_AUTOMATIC_EVENTS_SUPPORT // ==> Warning: Macro expansion producing 
- (void)setValidationEnabled:(BOOL)validationEnabled 
    _validationEnabled = validationEnabled;
    ...

#endif

【问题讨论】:

【参考方案1】:

我猜宏不能嵌套在 Xcode 9.3 中。 我也有这些警告。

宏是这样定义的,这会导致警告:

#if TARGET_OS_MAC
    #define SCENEKIT_SDK_AVAILABLE defined(POP_USE_SCENEKIT)
#elif TARGET_OS_IPHONE
    #define SCENEKIT_SDK_AVAILABLE defined(POP_USE_SCENEKIT)
#endif

我这样修复它:

#if defined(POP_USE_SCENEKIT)
# define USE_SCENEKIT 1
#else
# define USE_SCENEKIT 0
#endif
#if TARGET_OS_MAC
    #define SCENEKIT_SDK_AVAILABLE USE_SCENEKIT
#elif TARGET_OS_IPHONE
    #define SCENEKIT_SDK_AVAILABLE USE_SCENEKIT
#endif

我像这样分离了宏“SCENEKIT_SDK_AVAILABLE”,警告消失了。

你可以试试我的方法。

【讨论】:

以上是关于产生“已定义”的宏扩展具有未定义的行为的主要内容,如果未能解决你的问题,请参考以下文章

可能未定义的宏:AC_MSG_FAILURE

a[a[0]] = 1 会产生未定义的行为吗?

如果算法 std::mismatch 的两个范围的大小不同会产生未定义的行为?

VBA的宏显示“子过程或函数未定义”

glew未定义的OpenGL函数[关闭]

如何修复链接源文件时未定义的宏?