Code Fix

初級

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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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