小编han*_*ach的帖子

C11 alignas与clang -Wcast-align

所以我有以下最小化的C11代码,它定义了一个包含uint16_t的结构(这意味着它应该与2个字节对​​齐的结构)并且我想将一个char缓冲区转换为指向该结构的指针.

随着警告全部上升,clang正确地抱怨结构的对齐要求未得到满足.所以我alignas在缓冲区中添加了一个C11 说明符,以确保缓冲区已经充分对齐,但是没有关闭clang.

我的问题是:我做错了alignas什么?或者只是-Wcast-align诊断只查看参数的类型而不是手动指定的对齐?(我意识到我可以只是为了void*使诊断静音,但由于这段代码应该是可移植的,所以除非我确定它是误报,否则我不想侧面执行诊断.)

#include <stdint.h>
#include <stdalign.h>

struct foo {
    uint16_t field1;
};


int main(void) {
    alignas(struct foo) char buffer[122] = {0};
    struct foo *foo = (struct foo*)buffer;
    return foo->field1;
}
Run Code Online (Sandbox Code Playgroud)

编译器选项和错误消息:

$ clang -ggdb -O3 foo.c -Weverything -Werror -Wno-c++98-compat -Wno-c11-extensions
foo.c:11:23: error: cast from 'char *' to 'struct foo *' increases required alignment from 1 to 2 [-Werror,-Wcast-align]
    struct foo *foo = (struct foo*)buffer;
                      ^~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

编译器版本:

$ clang -v
clang version 3.5.1 …
Run Code Online (Sandbox Code Playgroud)

c clang memory-alignment c11

21
推荐指数
1
解决办法
1745
查看次数

标签 统计

c ×1

c11 ×1

clang ×1

memory-alignment ×1