最近遇到了一个C ++项目,经常看到以下预编译代码:
#ifdef _WIN32
#define __attribute__(x)
#endif
一般来说它用于什么?
答案 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
。我还没有看到它被大量使用。这有点让人感到羞耻,因为它确实是这个问题的便携式解决方案。