error: implicit declaration of function 'X' の原因と直し方
標準ライブラリの関数を使う際に、対応する#includeを書き忘れたときに出るエラーです。以前のC言語では警告どまりでしたが、現在は多くの環境でエラーとして扱われます。
エラーメッセージの読み方
main.c:5:21: error: implicit declaration of function 'strlen' [-Wimplicit-function-declaration]
main.c- ファイル名
5- 行番号
21- 列番号 — この位置でgccが構文解析に失敗しました
implicit declaration of function 'strlen' [-Wimplicit-function-declaration]- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 #include <stdio.h> 2 ^ 3 4 int main(void) { 5 printf("%zu\n", strlen("hi")); 6 return 0; 7 }
main.c:5:21: error: implicit declaration of function 'strlen' [-Wimplicit-function-declaration]
strlenはstring.hで宣言されている関数です。宣言が見えない状態で呼び出すと、コンパイラはその存在を知らないためエラーになります。
直し方: (空) を #include <string.h> にします。
広告
広告スロット(未設定)
パターン2
1 #include <stdio.h> 2 ^ 3 4 int main(void) { 5 printf("%d\n", abs(-5)); 6 return 0; 7 }
main.c:5:20: error: implicit declaration of function 'abs' [-Wimplicit-function-declaration]
absはstdlib.hで宣言されています。関数名だけ合っていても、宣言をインクルードしていなければコンパイラは受け付けません。
直し方: (空) を #include <stdlib.h> にします。
パターン3
1 #include <stdio.h> 2 ^ 3 4 int main(void) { 5 printf("%.1f\n", sqrt(9.0)); 6 return 0; 7 }
main.c:5:22: error: implicit declaration of function 'sqrt' [-Wimplicit-function-declaration]
sqrtはmath.hで宣言されています。数学関数だからといって自動で使えるわけではなく、対応するヘッダが必要です。
直し方: (空) を #include <math.h> にします。
よくある誤解
「関数名さえ合っていれば動くはず」というのは古いC(C89)の話です。現在のコンパイラは、宣言(プロトタイプ)が見えない関数呼び出しをその場で拒否します。関数がどのヘッダに属するかを覚えておく必要があります。
まとめ
error: implicit declaration of function 'X'は初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。