【发布时间】:2011-07-29 23:10:59
【问题描述】:
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 页面上说,这些宏在
Platform.h中定义,您是否查找该文件? -
技术上是否合法,如果它使用您支持的某个编译器构建,并且有足够影响力的客户想要它,那么您无论如何都应该考虑支持它,至少在运行时标志后面,可能即使它是由 CMake 或其他东西在宏中进行的。如果是 CMake-d,那么您可以将其推回给客户,让他们让 CMake 生成实际编译的代码,然后进行静态分析?
-
@John 它很可能是由构建脚本生成的,而不是在源代码签出中生成的。 Tradsud,你真的尝试过构建 WebKit 来看看它的作用吗?
-
看起来很合法:ideone.com/osJuG.
标签: c++ macros webkit c-preprocessor