文件范围变量的对齐方式

时间:2018-05-17 05:32:08

标签: c visual-studio

我找到了一个来源,作者对这些变量的对齐和顺序做出了假设:

#include <stdio.h>

#pragma pack(push)
#pragma pack(1)
int a;
char b;
char c;
#pragma pack(pop)

void foo(FILE *f)
{
    fwrite(f, &a, 6);
}

我知道在结构的上下文中包装pragma。但这也可以用于文件范围变量吗?如果这适用于给定的编译器,那么是在C标准中定义的吗?

1 个答案:

答案 0 :(得分:2)

我强烈怀疑(但无法证明)发布的代码片段中的#pragma指令毫无意义。编译器会做一个注释来打包它找到的任何结构声明,但它没有找到任何结构声明。 (这不是我希望编译器警告的那种东西。)

代码工作(如果有效),不是因为#pragma指令确保了它。

特定#pragma指令的行为取决于编译器,但可以肯定地说,不,打包编译指示可以用于文件范围变量。

毋庸置疑,在发布的代码片段中表达的习惯是一个可怕的,可怕的想法,即使它似乎有效,也不应该依赖它。如果它有效,它的工作原因是错误的,并且完成同样的任务有更好的方法。