我在使用 C11 和结构的 -Wpadded 时遇到了一些问题。
我已经阅读了Structure member alignment with _Alignas,我查看了 clang 文档,发现它现在受支持。
另外,我正在使用我最近从主干构建的一个非常新版本的 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,以便不再发出警告。