以下预编译是啥意思?
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
,可以在宏中使用。我还没有看到它被大量使用。这有点可惜,因为它确实有望成为解决此问题的便携式解决方案。
【讨论】:
以上是关于以下预编译是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章