C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了这个宏观声明是合法的C还是别的什么?如果它是合法的,它是如何工作的大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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.预处理器定义的指令与逻辑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)
//..@L_546_11@me code
#end if

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

if (PLATFORM(MAC))
{
    //..@L_546_11@me code
}

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

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

大佬总结

以上是大佬教程为你收集整理的这个宏观声明是合法的C还是别的什么?如果它是合法的,它是如何工作的全部内容,希望文章能够帮你解决这个宏观声明是合法的C还是别的什么?如果它是合法的,它是如何工作的所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。