以下预编译是什么意思?
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
可以在宏中使用。我还没有看到它被广泛使用。这有点遗憾,因为它确实有望成为解决此问题的便携式解决方案。
最近在做一个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
可以在宏中使用。我还没有看到它被广泛使用。这有点遗憾,因为它确实有望成为解决此问题的便携式解决方案。