2 つの変数の構造型が同じであることを確認するには、マクロを使用します
#define assert_same_struct_types(a, b) ((void) (sizeof((a)=(b))))
関数のようなマクロの場合
#define m(a,b) blablabla
a と b が同じ構造体型であると仮定して、コンパイル時のチェックを追加します。
#define m(a,b) (assert_same_struct_types(a, b), blablabla)
m(a,b) の呼び出し元が誤って m に異なるタイプの構造体を渡すと、コンパイラ エラーが発生します。
ただし、このアプローチは、組み込み型とポインター型の間で暗黙的な変換が行われるため、常に機能するとは限りません。
では、必ずしも構造体ではなく、任意の型についてこの問題を解決することは可能ですか?
C89 の解決策が必要ですが、C99 または C11 の可能性について聞くのは興味深いことです。