26

私は長い間 C プログラマーですが、memcpy を使用する代わりに、構造体変数を相互に直接割り当てることができることを最近知りました。

struct MyStruct a,b;
...
a = b; /* implicit memcpy */

これは C にとっては少し「高水準」に感じられますが、間違いなく便利です。しかし、等値と不等値の比較ができないのはなぜですか。

if (a == b) ...
if (a != b) ...

標準がこれを除外する正当な理由はありますか? それとも、これは - そうでなければ非常にエレガントな - 標準の矛盾ですか?

memcpy をきれいな割り当てに置き換えることができる理由はわかりませんが、それらの醜い memcmp を所定の位置に保持する必要があります。

4

1 に答える 1

27

comp.lang.c FAQによると:

コンパイラが構造体の比較を実装する(つまり、構造体の==演算子をサポートする)ための良い方法はありません。これは、Cの低レベルのフレーバーと一致しています。単純なバイトごとの比較により、構造内の未使用の「穴」に存在するランダムビットを見つけることができます(このようなパディングは、後のフィールドの配置を正しく保つために使用されます)。フィールドごとの比較では、大きな構造に対して許容できない量の反復コードが必要になる場合があります。コンパイラによって生成された比較では、すべての場合にポインタフィールドを適切に比較することは期待できませんでした。たとえば、char*フィールドを==ではなくstrcmpと比較することが適切な場合がよくあります。

2つの構造を比較する必要がある場合は、フィールドごとに独自の関数を作成する必要があります。

于 2009-12-10T18:26:36.810 に答える