64位内核上存在__attribute__的哪些替代方法?

时间:2010-04-02 13:35:20

标签: c gcc iso

64位内核上是否有非ISO gcc特定扩展__attribute__的替代方法?

我注意到的三种类型是:函数属性,类型属性和变量属性。

例如。 我想避免对通过网络传递的结构使用__attribute__((__packed__)),即使某些基于gcc的代码确实使用它。

有关如何完全避免在C系统/内核代码中使用 __attribute__的任何建议或指示?

感谢 Saifi的。

2 个答案:

答案 0 :(得分:1)

  

有关如何完全避免C系统/内核代码中属性使用的任何建议或指示?

您可以逐个构建网络数据包,将每个数据元素复制到char*缓冲区中的正确位置。

优点:你没有任何对齐问题,而且它通常是可移植的,特别是如果你使用<stdint.h>中的精确宽度整数类型

缺点:这很乏味且可能容易出错

答案 1 :(得分:0)

我根据你的评论假设你想要改变你的代码,而不是整个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);

当您的断言错误时,构建将失败,并显示有用的错误和行号