以下预编译是什么意思

What does following precompilation mean?

本文关键字:是什么 意思 编译      更新时间:2023-10-16

最近遇到一个C++项目,经常看到以下预编译代码:

#ifdef _WIN32
#define __attribute__(x)
#endif

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

__attribute__是一个特殊的关键字,例如GCC支持,用于指定对齐之类的内容。

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

编辑

例如,宏可以具有以下形式:

#define DOUBLE(x) (x*2)

因此,如果你在源代码中编写DOUBLE(4),它将在传递给编译器之前被预处理器扩展/替换以(4*2)。如果省略应扩展到的部分,则会将其扩展为空字符串。

我只是在@t.niese的第一个答案中添加一些背景知识

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

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

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