1

私はCの経験がなく、各バイトが異なることをする配列にメッセージが格納されたマイクロコントローラーで作業しています。配列の各要素に、msg[1]、msg[2] などとして参照する代わりに、人間が読める名前を付けるにはどうすればよいですか?

これは構造体の目的ですか?しかし、「フィールド間にパディングがある可能性があるため、構造体のバイナリ レイアウトについて推測することはできません。」

このようなマクロを使用する必要がありますか? (「マクロが悪い」ことは知っていますが、コードはすでにそれらでいっぱいです)

#define MSG_ID       msg[0]
#define MSG_COMMAND  msg[1]

おー!または、私はただできると思います

MSG_ID = 0;
MSG_COMMAND = 1;
MSG[MSG_ID];

少し醜い場合は、おそらくそれが良いでしょう。

4

3 に答える 3

3

そのルートに行きたい場合は、確かにマクロを使用しますが、提案したものよりも優れたものにします。

#define MSG_ID(x)      (x)[0]
#define MSG_COMMAND(x) (x)[1]

これにより、コードは、マクロで機能する方法ではなく、意味のある方法で配列に名前を付けることができます。

それ以外の場合は、代わりにインデックスの定数を定義できます (申し訳ありませんが、より良い名前を思い付くことができませんでした...):

#define IDX_MSG_ID      0
#define IDX_MSG_COMMAND 1

責任を持って使用すれば、マクロは悪くありません。この種の「単純なエイリアシング」は、マクロが適切に命名され、十分に文書化されていれば、コードを読みやすく理解しやすくするのに役立つケースの 1 つです。

編集: @Lundin のコメントによると、コードの読みやすさと安全性を向上させる最善の方法は、次のように型と関数のセットを導入することです (保存しcharてメッセージがMESSAGE_SIZE長いと仮定します):

typedef char MESSAGE[MESSAGE_SIZE];
char get_message_id(MESSAGE msg) { return msg[0]; }
char get_message_command(MESSAGE msg) { return msg[1]; }

この方法は、ある程度の型安全性をもたらし、使用からストレージを抽象化することを可能にしますが、マイクロコントローラーの世界では問題となる可能性がある呼び出しオーバーヘッドも導入します。コンパイラ、関数をインライン化することで、この問題の一部を軽減する場合があります (inline定義にキーワードを追加することで、これを促進できます)。

于 2012-01-25T15:58:07.520 に答える
2

C で一連の整数に名前を付けるための最も自然な概念は列挙型です。

enum msg_pos { msg_id, msg_command, };

デフォルトでは、カウントを開始0して 1 ずつ増やします。msg[msg_id]たとえば、フィールドにアクセスします。

于 2012-01-25T19:33:22.433 に答える
1

コンパイラがそれらをどのようにレイアウトするかを理解するのに時間がかかる場合は、構造体を使用しても問題ありません。構造体は組み込みプログラミングで非常に役立ちます。メンバーは常に順番に配置されますが、8 ビット マイクロでない場合はパディングが発生する可能性があります。GCCには、パディングを禁止するために構造体に適用できる「packed」属性があり、他の一部のコンパイラには同様の機能があります。

于 2012-01-25T16:09:04.633 に答える