我找到了一个来源,作者对这些变量的对齐和顺序做出了假设:
#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标准中定义的吗?
答案 0 :(得分:2)
我强烈怀疑(但无法证明)发布的代码片段中的#pragma
指令毫无意义。编译器会做一个注释来打包它找到的任何结构声明,但它没有找到任何结构声明。 (这不是我希望编译器警告的那种东西。)
代码工作(如果有效),不是因为#pragma
指令确保了它。
特定#pragma
指令的行为取决于编译器,但可以肯定地说,不,打包编译指示可以不用于文件范围变量。
毋庸置疑,在发布的代码片段中表达的习惯是一个可怕的,可怕的想法,即使它似乎有效,也不应该依赖它。如果它有效,它的工作原因是错误的,并且完成同样的任务有更好的方法。