うーん、ダメ。マクロはマクロです。マクロ置換の結果が有効な式(または型)である場合、コードはコンパイルされます。コンパイラはあなたが何をしたいのかわかりません。
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 */
そして、あなたは反対方向に動きたいようです。