为什么gcc意外地剥离__attribute __(__ packed__)?

时间:2015-03-28 01:31:11

标签: gcc

预处理器何时剥离属性是否有原因 指定-U__GNUC__并且至少有1个#include指令? 这对我来说似乎是令人惊讶的行为。这是一个例子:

$ cat foo.c
#include <limits.h>

struct S {
       int a;
} __attribute__((__packed__));
$ gcc -E -U__GNUC__ foo.c | tail -3
struct S {
       int a;
} ;

但是如果我删除#include指令(或者如果我删除-U__GNUC__)那么 属性不会被预处理器剥离,这就是我 期待发生。

$ cat foo2.c
struct S {
       int a;
} __attribute__((__packed__));
$ gcc -U__GNUC__ -E foo2.c
# 1 "foo2.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "foo2.c"

struct S {
        int a;
} __attribute__((__packed__));

这是一个gcc错误还是有这种行为的文档?

1 个答案:

答案 0 :(得分:1)

在我的平台上,标准标题间接包含/usr/include/argp.h。并在argp.h中说

#ifndef __attribute__
/* This feature is available in gcc versions 2.5 and later.  */
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
#  define __attribute__(Spec) /* empty */
# endif
...
#endif

即。对于__GNUC____STRICT_ANSI__模式的低值,__attribute__预定义为空宏。通过取消__GNUC__取消,您使其在0上下文中的行为与#if相同。因此,上面的代码将__attribute__转换为空宏。