1

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

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

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

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

谢谢赛菲。

4

2 回答 2

1

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

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

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

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

于 2010-04-02T13:37:57.037 回答
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);

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

于 2010-04-02T14:55:15.553 回答