error: invalid operands to binary ==(構造体同士の==比較)
構造体同士を==で比較しようとしたときに出るエラーです。Cの==は組み込み型専用で、構造体には定義されていません。
エラーメッセージの読み方
main.c:8:11: error: invalid operands to binary == (have 'struct Point' and 'struct Point')
main.c- ファイル名
8- 行番号
11- 列番号 — この位置でgccが構文解析に失敗しました
invalid operands to binary == (have 'struct Point' and 'struct Point')- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 #include <stdio.h> 2 3 struct Point { int x, y; }; 4 5 int main(void) { 6 struct Point a = {1, 2}; 7 struct Point b = {1, 2}; 8 if (a == b ) { ^ 9 printf("same\n"); 10 } 11 return 0; 12 }
main.c:8:11: error: invalid operands to binary == (have 'struct Point' and 'struct Point')
Cの==は組み込み型専用です。構造体を比較するには、メンバを1つずつ==で比較する必要があります。
直し方: a == b を a.x == b.x && a.y == b.y にします。
広告
広告スロット(未設定)
パターン2
1 #include <stdio.h> 2 3 struct Color { int r, g, b; }; 4 5 int main(void) { 6 struct Color c1 = {255, 0, 0}; 7 struct Color c2 = {255, 0, 0}; 8 if (c1 == c2 ) { ^ 9 printf("same color\n"); 10 } 11 return 0; 12 }
main.c:8:12: error: invalid operands to binary == (have 'struct Color' and 'struct Color')
メンバが3つに増えても事情は同じです。構造体全体の比較演算子はCには存在しません。
直し方: c1 == c2 を c1.r == c2.r && c1.g == c2.g && c1.b == c2.b にします。
パターン3
1 #include <stdio.h> 2 3 struct Pair { int a, b; }; 4 5 int main(void) { 6 struct Pair p1 = {3, 4}; 7 struct Pair p2 = {3, 5}; 8 if (p1 == p2 ) { ^ 9 printf("equal\n"); 10 } else { 11 printf("different\n"); 12 } 13 return 0; 14 }
main.c:8:12: error: invalid operands to binary == (have 'struct Pair' and 'struct Pair')
コンパイラは構造体のメンバ構成を知っていても、==による自動比較は生成しません。必ず自分で書く必要があります。
直し方: p1 == p2 を p1.a == p2.a && p1.b == p2.b にします。
よくある誤解
構造体もひとつの値のように見えるため==で比較できそうに感じますが、Cはこの比較を自動生成しません。すべてのメンバを1つずつ==で比較する専用の関数を自分で書く必要があります。
まとめ
error: invalid operands to binary ==(構造体同士の==比較)は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。