c - _Alignas 结构成员使用 clang & C11

标签 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,以便不再发出警告。

最佳答案

-Weverything 打印 C 所需的所有诊断消息以及 C 不需要的一些诊断。C 不需要在此处打印的诊断:其目的是提供信息,您的程序已经严格符合。 C 表示一个实现可以自由地产生额外的诊断消息,只要它不会无法翻译程序。

关于c - _Alignas 结构成员使用 clang & C11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15031061/

相关文章:

c - 段错误 - 调试程序集 gdb

c - 如何在 C 中执行此程序?第 3.0 部分

c++ - 保留标识符在编译的哪个阶段被保留?

c++ - 如何在 Windows 上紧密打包结构?

c - 如何在 C 中使用 libsox 更改声音文件的速度?

c - 如何更改 intel cpu 中的智能缓存功能?

c - 如何定义一个模式,该模式将等同于 Flex 中扫描仪无法识别的所有标记?

C++缓冲区溢出在3台机器上不同

c++ - 删除/修改结构数组中的元素

c - 读取带有分隔符的数据字符串并存储到结构中