error: unknown type name の原因と直し方
型名の大文字小文字を間違えたときに出るエラーです。intをIntと書いてしまうなど、キーボードの打ち間違いで起きがちです。
エラーメッセージの読み方
main.c:4:5: error: unknown type name 'Int'; did you mean 'int'?
main.c- ファイル名
4- 行番号
5- 列番号 — この位置でgccが構文解析に失敗しました
unknown type name 'Int'; did you mean 'int'?- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 #include <stdio.h> 2 3 int main(void) { 4 Int x = 5; ^ 5 printf("%d\n", x); 6 return 0; 7 }
Cの組み込み型はすべて小文字です。大文字始まりのIntという型名は存在しません。
直し方: Int を int にします。
パターン2
1 #include <stdio.h> 2 3 int main(void) { 4 Double price = 9.99; ^ 5 printf("%.2f\n", price); 6 return 0; 7 }
他の言語の型名の綴りに引きずられて大文字で書いてしまう典型的なミスです。Cのdoubleは常に小文字です。
直し方: Double を double にします。
パターン3
1 #include <stdio.h> 2 3 int main(void) { 4 Char grade = 'A'; ^ 5 printf("%c\n", grade); 6 return 0; 7 }
gccは似た名前の既知の型を候補として提示してくれます(did you mean 'char'?)が、あくまで提案であり自動修正はされません。
直し方: Char を char にします。
パターン4
1 #include <stdio.h> 2 3 int main(void) { 4 Boolean flag = 1; ^ 5 printf("%d\n", flag); 6 return 0; 7 }
Booleanのような他言語風の型名はCには存在しません。真偽値もint(0/1)として扱うのが基本です。
直し方: Boolean を int にします。
パターン5
1 #include <stdio.h> 2 3 int main(void) { 4 Long count = 10; ^ 5 printf("%ld\n", count); 6 return 0; 7 }
longも組み込み型なので小文字です。大文字始まりのLongという型名は存在しません。
直し方: Long を long にします。
よくある誤解
Javaなど型名が大文字始まりの言語に慣れていると、Cでも同じ感覚で書いてしまいがちです。Cの組み込み型(int・char・doubleなど)はすべて小文字で、大文字小文字を区別します。
実務での勘所
Cの文法は、識別子が「型名」なのか「変数名」なのかによって、それ以降の解釈のされ方が変わるという性質を持っています(いわゆる"typedef名問題")。たとえばfoo bar;という並びは、fooが型名として認識されていれば「barという変数をfoo型で宣言する」という意味になりますが、そうでなければ構文エラーになります。Intのように大文字で書いてしまうと、コンパイラは「型名としてもtypedefとしても見たことが無い識別子」として扱い、unknown type nameという専用のエラーで区別して報告します。