Code Fix

中級

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 == ba.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 == c2c1.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 == p2p1.a == p2.a && p1.b == p2.b にします。

この問題を解いてみる →

よくある誤解

構造体もひとつの値のように見えるため==で比較できそうに感じますが、Cはこの比較を自動生成しません。すべてのメンバを1つずつ==で比較する専用の関数を自分で書く必要があります。

まとめ

error: invalid operands to binary ==(構造体同士の==比較)は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)