以下预编译是什么意思?

What does following precompilation mean?

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

#ifdef _WIN32
#define __attribute__(x)
#endif

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

__attribute__ 是支持的特殊关键字,例如通过 gcc,指定诸如对齐之类的东西。

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

编辑

一个宏可以有例如如下形式:

#define DOUBLE(x) (x*2)

因此,如果您要在源代码中编写 DOUBLE(4),那么在传递给编译器之前,预处理器会将 expanded/replace 转换为 (4*2)。如果省略应展开的部分,则展开为空字符串。

我将在@t.niese

的第一个回答中添加一些背景知识

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

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

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