这个宏语句是合法的C++还是别的什么?如果它是合法的,它是如何工作的

Tra*_*sud 6 c++ macros webkit c-preprocessor

WebKit有很多这样的预处理器行: #if MACRO1(MACRO2)

例如:

#if PLATFORM(MAC) || (PLATFORM(QT) && USE(QTKIT))
#include "MediaPlayerPrivateQTKit.h"
#if USE(AVFOUNDATION)
#include "MediaPlayerPrivateAVFoundationObjC.h"
#endif
...
Run Code Online (Sandbox Code Playgroud)

所以我的第一个想法是它们是类似函数的宏,但我看不出它是如何工作的,我在源代码中的任何地方都找不到这些宏的#defines.

我问另一位工程师它是什么,他从来没有见过像#if之前那样使用的多个宏.我发现这个维基页面谈论了它们,但我仍然不清楚它们来自哪里,

那么我的问题是:这是有效的C++还是在代码中被其他工具/语言(如CMake或其他东西)替换,如果它是有效的C++是否有人知道有关此问题的说明?

我是一个不处理这种语法的C++静态分析工具的支持工程师.一位客户要求我们处理它,但如果我要把它带给高级工程师,我不想听起来像个白痴:)所以如果有人知道的话,我会喜欢这个细节.

Jas*_*son 5

正如在wiki中所提到的,在root/trunk/Source/JavaScriptCore/wtf/Platform.h中,我们得到了每个定义的定义.例如,PLATFORM宏定义为:

#define PLATFORM(WTF_FEATURE) \
       (defined WTF_PLATFORM_##WTF_FEATURE \
        && WTF_PLATFORM_##WTF_FEATURE)
Run Code Online (Sandbox Code Playgroud)

WTF_FEATURE将使用平台名称替换值以创建一些名为的宏WTF_PLATFORM_WTF_FEATRE.例如,随着WTF_FEATURE传入宏MAC,你最终将扩展为WTF_PLATFORM_MAC.defined与逻辑相结合的预处理器指令AND基本上是询问是否定义了该宏,如果定义了宏值,则其值是否为"真"值.您可以在预处理器的其他位置使用此宏,如:

#ifdef __APPLE__
#define WTF_PLATFORM_MAC 1
#end if

#define PLATFORM(WTF_FEATURE) \
       (defined WTF_PLATFORM_##WTF_FEATURE \
        && WTF_PLATFORM_##WTF_FEATURE)

#if PLATFORM(MAC)
//...some code
#end if
Run Code Online (Sandbox Code Playgroud)

您不会在C++代码本身中使用它

if (PLATFORM(MAC))
{
    //...some code
}
Run Code Online (Sandbox Code Playgroud)

因为defined不是C++关键字会导致编译器产生大量错误,并且在C++代码中评估和替换宏最终会将defined预处理器指令转储到任何直接调用宏的C++代码中.这不是有效的C++.

感谢Johannes指出其中的一些问题.