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

标签 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
...

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

我问过另一位工程师这是什么,他之前也从未见过在 #if 中像这样使用多个宏。 我找到了这个 wiki page谈到他们,但我仍然不清楚他们来自哪里,

那么我的问题是:这是有效的 C++ 还是它在代码中被另一种工具/语言(如 CMake 或其他东西)替换,如果它是有效的 C++,是否有任何人都知道讨论这个的规范?

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

最佳答案

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

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

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

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

if (PLATFORM(MAC))
{
    //...some code
}

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

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

关于c++ - 这个宏语句是合法的 C++ 还是其他什么?如果它是合法的,它是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6879946/

相关文章:

c++ - 无法管理链接 cpp 文件 - 未解析的外部符号

c++ - 如何在C++中将数字添加到分数?

c++ - 防止解构宏中定义的匿名变量直到范围结束

android - Android 网络浏览器上的 <select> 标签问题

C++ 遍历某个子类的列表

c++ - 在 Intellisense 中评估枚举中的字符串常量

function - Clojure 星号特殊形式(fn*、let* 等...)

c++ - 在 VC 2015 上使用带有字符串的宏失败

css - CSS3 webkit-transition使用div的多个属性和多个webkit-transition-delay

java - 我想制作一个网络浏览器,但我不确定从哪里开始?