预编译后的意思是什么?

时间:2018-01-23 12:49:32

标签: c++ precompile

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

#ifdef _WIN32
#define __attribute__(x)
#endif

一般来说它用于什么?

2 个答案:

答案 0 :(得分:8)

__attribute__是支持的特殊关键字,例如通过gcc,指定像对齐这样的东西。

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

修改

宏可能有例如以下表格:

#define DOUBLE(x) (x*2)

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

答案 1 :(得分:2)

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

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

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

C99和C ++ 11添加可以在宏中使用的_Pragma。我还没有看到它被大量使用。这有点让人感到羞耻,因为它确实是这个问题的便携式解决方案。