1

__attribute__64ビットカーネルで非ISOgcc固有の拡張機能に代わるものはありますか?

私が気付いた3つのタイプは、関数属性、タイプ属性、変数属性です。

例えば。__attribute__((__packed__))一部のgccベースのコードでは使用されていますが、ネットワークを介して渡される構造体には使用しないようにしたいと思います。

Cシステム/カーネルコードでの使用を完全に回避 する方法に関する提案や指針はありますか?__attribute__

サイフィに感謝します。

4

2 に答える 2

1

Cシステム/カーネルコードで属性の使用を完全に回避する方法に関する提案や指針はありますか?

ネットワーク パケットを 1 つずつ構築し、各データ要素を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 に答える