C++ Apple LLVM 6.0预处理器(如定义)()

C++ Apple LLVM 6.0预处理器(如定义)(),c++,xcode,xcode6,clang,c-preprocessor,C++,Xcode,Xcode6,Clang,C Preprocessor,我目前正在做一个有很多依赖关系的项目。它是用C++库编写在Objtovi-C中的。它使用跨平台代码,对库中的不同平台进行条件编译 在最新的更新之后,我遇到了一个关于预处理器宏的特殊问题 #if defined(DEBUG) #warning WARNING_1 #elif defined(DEBUG_gibberish) #warning WARNING_2 #elif defined(SOMETHING) #warning WARNING_3 #else #warning WARNING_DE

我目前正在做一个有很多依赖关系的项目。它是用C++库编写在Objtovi-C中的。它使用跨平台代码,对库中的不同平台进行条件编译

在最新的更新之后,我遇到了一个关于预处理器宏的特殊问题

#if defined(DEBUG)
#warning WARNING_1
#elif defined(DEBUG_gibberish)
#warning WARNING_2
#elif defined(SOMETHING)
#warning WARNING_3
#else
#warning WARNING_DEFAULT
#endif
代码

在这种情况下,
DEBUG
宏在Xcode Apple LLVM 6.0预处理部分中定义

请看图片

所以基本上,问题在于#if defined()对于这个特定的项目并没有像预期的那样工作。如果我将相同的代码复制到某个干净的测试项目中,它将按预期工作

它还有另一个有趣的效果,如果我定义
DEBUG\u gibberish
,那么它将被评估,而不是其他情况。在进行了两次实验之后,它似乎总是评估/使用第一个真实条件,然后评估/使用第二个真实条件,或者如果没有第二个真实条件,则评估/使用第二个真实条件

我已经尝试过清理项目、清理派生数据、重新启动Xcode、重新启动mac甚至巫毒娃娃

如果您能想到为什么会发生这种情况以及如何解决,我将不胜感激


EDIT1:我的主项目中有一个Xcode项目的层次结构。有问题的库是我的主项目中的一个子项目。如果我尝试单独构建它,它会很好地工作。如果我从主项目将其编译为依赖项,我会遇到这个问题。

好的,我发现了问题

在我的项目中,我使用来自第三方库的一些头来创建我自己的库类的子类

  • 我相信Xcode提供了警告的复合表示:

    在“我的代码”中,它在对中的标题进行预处理后显示
    警告\u 1
    定义了
    DEBUG
    宏的库

    然后在预处理相同的标题后,它显示
    警告\u默认值
    在我的项目中,未定义
    DEBUG

    但这两个警告都显示在同一个文件中

  • 通过这样做,我得出结论,预处理器或我的代码有问题。正因为如此,我并没有想到我的项目和库是分开构建的,并且我的项目不包含所需的宏


  • 所以最终的解决方案很简单,我必须在我的项目中定义所需的宏,然后进行良好的编译。

    了解如何获得某个文件的预处理形式。试试
    clang-C-esomefile.cc>somefile.ii
    (或者
    g++-C-esomefile.cc>somefile.ii
    )。阅读维基网页