如果在没有“__attribute __(align(8))”的情况下声明结构,如何生成警告

时间:2014-01-31 09:17:05

标签: c linux gcc compiler-construction

如果结构声明没有__attribute__(align(8)),我希望编译器为我生成警告。

例如,如果结构声明如下:

struct my_float {
        float number;
}  __attribute__((aligned(8)));

它不会产生任何警告。但是,如果我声明另一个这样的结构:

struct my_float {
        float number;
};

编译器会为我生成警告。

我的工作环境是linux / GCC。

2 个答案:

答案 0 :(得分:1)

我认为您不能自动检查所有结构,但您仍然可以通过以下方式手动检查对齐:

// x % 16 <=> x & (16-1)  (avoid using modulo operator)
#define MODULO_16_MASK 0xFU
ASSERT_COMPILE((sizeof(my_float) & MODULO_16_MASK) == 0);

如果您的结构未对齐,则应在编译时触发警告。

答案 1 :(得分:0)

根据经验,这是不可能的。 此属性指定指定类型的变量的最小对齐(以字节为单位)。

struct S { short f[3]; } __attribute__ ((aligned (8)));
typedef int more_aligned_int __attribute__ ((aligned (8)));

强制编译器,每个类型为struct S或more_aligned_int的变量至少在8字节边界上分配和对齐。