可移植地确定用于对齐的最严格的数据类型

时间:2014-01-06 18:48:58

标签: c linux alignment posix

如果我没有忽略某些东西,选择uintmax_t将处理整数情况。

(1)浮点数是否有类似的数据类型,如果是,则在哪个标题中? (对我来说,它不在float.h中)

(2)选择这两种数据类型的并集是正确的(假设我们可以回答(1)是肯定的)应该总是最具限制性的吗?

2 个答案:

答案 0 :(得分:4)

正如Eric的回答所指出的那样,C11在<stddef.h>中定义了一个具有最大基本对齐的对象类型:max_align_t

但是,请注意,这可能仍未按预期在GCC上运行。取自gcc的网站:

  

C标准的第四个版本,即C11,发表于   2011年为ISO / IEC 9899:2011。海湾合作委员会基本上完全支持   此标准,使用-std = c11或-std = iso9899:2011启用。 (而在   开发,这个标准版本的草稿被称为C1X。)

如果由于其新鲜度和当前缺乏支持而不想依赖C11,我建议使用所有整数类型,所有浮点类型,void指针和函数指针来定义联合:其中一个必须是限制性最强的类型。

答案 1 :(得分:2)

实现支持的基本对齐最大的对象类型是max_align_t,在<stddef.h>中定义。

我没有在标准中看到指定联合的对齐要求的文本必须是其成员的最严格的对齐要求。因此,理论上,联盟可能需要比其任何成员所需的更严格的对齐。我认为这没有什么理由,也不希望C实现会这样做。通常的情况是联合的对齐要求是其成员的最严格要求,除非程序明确要求更大的对齐(与_Alignas关键字一样)。