以下预编译是啥意思?

Posted

技术标签:

【中文标题】以下预编译是啥意思?【英文标题】:What does following precompilation mean?以下预编译是什么意思? 【发布时间】:2018-01-23 12:49:32 【问题描述】:

最近接触一个C++项目,经常看到下面的预编译代码:

#ifdef _WIN32
#define __attribute__(x)
#endif

那么一般来说它的用途是什么?

【问题讨论】:

起初这意味着,使用属性的代码将编译并在以后静默失败!如果代码需要像 pack 和 alignment 这样的属性,而只是通过定义一个空宏来忽略,那么结果将完全被破坏。 【参考方案1】:

__attribute__ 是支持的特殊关键字,例如通过 gcc,指定对齐等内容。

给定的语句为__attribute__ 添加了一个empty #define,以便在定义_WIN32 时被预处理器删除。这是例如必需,如果编译器不支持__attribute__

编辑

宏可以有例如以下形式:

#define DOUBLE(x) (x*2)

因此,如果您在源代码中编写DOUBLE(4),它将被预处理器扩展/替换为(4*2),然后再传递给编译器。如果省略它应该扩展的部分,它将被扩展为一个空字符串。

【讨论】:

@HolyBlackCat 是的,这是真的,已将其更改为 things like 另外括号中的x是什么意思? @Finley 这只是宏的 参数。添加了一个编辑。 @Ron 如果定义了_WIN32,那么__attribute__ 将被忽略,因为它在预处理步骤中被空字符串替换。【参考方案2】:

我将为@t.niese 的第一个答案添加一些背景

__attribute__ 是 GCC 和其他一些编译器(clang、Intel)的扩展。它执行与#pragma 大致相同的工作。但是,#pragma 确实有一个主要缺点:您不能在宏中使用它们,因为它们在宏之前被处理。

所以添加了__attribute__,但是对于不支持它的编译器,您需要一个解决方法,如 cmets 和答案中所述。

C99 和 C++11 添加了_Pragma,可以在宏中使用。我还没有看到它被大量使用。这有点可惜,因为它确实有望成为解决此问题的便携式解决方案。

【讨论】:

以上是关于以下预编译是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

谁能告诉我预编译gcc -E .c文件,会有如下的信息,前面4行代表啥意思?

使用预编译库PREBUILT LIBRARY

ObjC宏定义-预编译小功能

VER是啥意思啊!?

J2ME应用程序的预验证是啥意思?

预加载是啥意思啊,和下载的区别是啥