__attribute__
在 64 位内核上是否有非 ISO gcc 特定扩展的替代方案?
我注意到的三种类型是:函数属性、类型属性和变量属性。
例如。我想避免使用__attribute__((__packed__))
通过网络传递的结构,即使一些基于 gcc 的代码确实使用它。
关于如何完全避免 __attribute__
在 C 系统/内核代码中使用的任何建议或指示?
谢谢赛菲。
关于如何完全避免在 C 系统/内核代码中使用属性的任何建议或指示?
您可以逐个构建网络数据包,将每个数据元素复制到char*
缓冲区中的正确位置。
优点:您没有任何对齐问题,而且它通常是可移植的,特别是如果您使用来自的精确宽度整数类型<stdint.h>
缺点:它很乏味并且可能容易出错
我根据您的评论假设您要更改的是您的代码,而不是整个 Linux 内核(等)。
不确定函数属性等,但专门针对属性打包,到目前为止,我已经完成了以下操作,没有任何问题。
基本上,您可以使用手动填充字段和编译时断言,而不是依赖编译器来打包。
struct foo {
u32 field1;
u16 field2;
u16 pad; // manual padding
// continue for other fields that the compiler would automatically pad for you with attribute packed
u32 field3;
};
要检查您的结构,您可以使用编译时断言,如下所示:
#define CASSERT(cond, name) typedef cassert__##name[cond ? 1 : -1]
CASSERT(offsetof(foo, field1) == 0, field1_wrong);
CASSERT(offsetof(foo, field2) == 4, field2_wrong);
当您的断言错误时,构建将失败并显示有用的错误和行号