预处理器何时剥离属性是否有原因 指定-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错误还是有这种行为的文档?
答案 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__
转换为空宏。