1

C で sizeof() を #define にする正当な理由がある場合もあると思いますが、sizeof() を構造体 (および私のsizeof() を #define にする必要はありません)。

例(不自然ですが、うまくいけば要点を示しています):

typedef struct my_struct
{
  fields
} MY_STRUCT;

#define MY_DEFINE 1234
my_size = sizeof(MY_DEFINE);  // Should be sizeof(MY_STRUCT)

これをキャッチする簡単で自動化された方法はありますか?

助けてくれてありがとう。ニックB

4

2 に答える 2

6

うーん、ダメ。マクロはマクロです。マクロ置換の結果が有効な式(または型)である場合、コードはコンパイルされます。コンパイラはあなたが何をしたいのかわかりません。

sizeofあなたを助けるかもしれない(または助けないかもしれない)1つのことは、この特定の例では、式ではなく型にしたいということですsizeof。コーディング標準が、次のように、常に構造体タグを介してそれを行うことを主張した場合

sizeof(struct my_struct)

そうすれば、あなたの例の特定のような偶発的な間違いは起こりにくくなります。他の間違いはありませんが。

おそらく、のサイズを、何らかの形で型を必要とするマクロに置き換えることができます(そして、通常の代わりにどこでも使用できますsizeof)。たとえば、このようなもの

#define SIZE_OF_TYPE(T) ((T *) 0, sizeof(T))

型以外の引数ではコンパイルに失敗します。ただし、一部の型引数ではコンパイルに失敗します。

実際、私はあなたの文脈を知りませんが、一般的に全体の考えは逆効果のようです。プログラミングの良い習慣は、実際にはsizeof型に適用することを避け、代わりに式に適用することを好むことです。

int *p = malloc(n * sizeof *p); /* good */

それ以外の

int *p = malloc(n * sizeof(int)); /* bad */

そして、あなたは反対方向に動きたいようです。

于 2009-11-06T16:38:04.153 に答える
2

typedef された名前にすべて大文字を使用しているのはなぜですか? typedef は、C プリプロセッサ構造とは対照的に、C 言語構造です。これは、他の識別子と同様に識別子です。

MACRO にすべて大文字のみを使用すると、それらを使用しているときにかなり明白になります。

于 2009-11-06T16:46:44.480 に答える