_Alignas用于结构成员使用clang& C11

时间:2013-02-22 18:44:20

标签: c compiler-construction struct c11

我在使用C11和结构的-Wpadded时遇到了一些麻烦。

我已经阅读了Structure member alignment with _Alignas,我查看了clang文档并发现它现在已得到支持。

另外,我正在使用我最近从trunk构建的一个非常新版本的clang。

$ clang --version
clang version 3.3 (trunk 175473)
Target: x86_64-unknown-linux-gnu
Thread model: posix

我遇到的问题是:

#include <stdlib.h>
#include <stdalign.h>

struct foo{
   void* a;
   int b;
};

int main() {
   struct foo instance;

   instance.a = NULL;
   instance.b = 2;

   return 0;
}

这引起了我的警告:

$ clang -Weverything -std=c11 t.c 
t.c:4:8: warning: padding size of 'struct foo' with 4 bytes to alignment boundary [-Wpadded]
struct foo{
       ^
1 warning generated.

现在这不是_Alignas的用途吗?我尝试将它放在int成员声明之前,如下所示:

struct foo{
   void* a;
   _Alignas(void*) int b;
};

但同样的警告仍然存在。我也尝试将_Alignas放在不同的地方,但无济于事。我在这里错过了什么?

我知道我可以忽略这个特殊警告,我理解为什么填充很重要,所以我对填充是什么的解决方法或解释不感兴趣。我想知道如何以符合标准的便携式方式更改我的C,以便不再发出警告。

1 个答案:

答案 0 :(得分:2)

-Weverything打印C所需的所有诊断消息以及C不需要的一些诊断.C不需要此处打印的诊断:其目的是提供信息,并且您的程序已经严格符合要求。 C表示,只要实现程序无法转换,实现就可以自由生成其他诊断消息。