【C言語】ライブラリの関数なのに「implicit declaration of function」になってしまう

 C言語 

作成日:2022/05/15

「implicit declaration of function」とは

プログラムは上から順に実行されます。

そのため、ある関数が実行される前に宣言(定義)しておく必要があります。

この警告は、それが行われていない場合に表示されます。

例えば以下のプログラム。

#include <stdio.h>

int main(void){
  printf("%d\n", sum(1, 2));
  return 0;
}

int sum (int a, int b) {
	return a + b;
}

コンパイルすると、以下の警告が出ます。

Main.c:4:18: warning: implicit declaration of function 'sum' is invalid in C99 [-Wimplicit-function-declaration]
  printf("%d\n", sum(1, 2));

今回のケース

上記で述べたケースは、自分で作成した関数なので、警告を消すのは簡単です。

 main  sum の順番を入れ替えるだけで解決です。

しかし、私が直面したのは、この警告の対象の関数がライブラリで定義されているものだったのです。。。

それは、Apache HTTP 2.4で提供されている ap_args_to_table 関数です。

何をしたかったかというと、Apacheサーバの開発モジュール(Apache モジュール)を使い、GETリクエストのクエリパラメータを取り出す、という処理です。

こちらにある例をそのまま真似してコンパイルしたのですが、なぜか ap_args_to_table 関数だけimplicit declaration of functionの警告が出てしまいます。

もちろん基本的なヘッダファイルはインポートしています。

基本的に、ライブラリのDocsを見れば、「この関数を使いたければ、このヘッダファイルをインポートしてね!」と書いてありますが、今回の関数はDocsが404でした。。。

対処法

結論を言うと、以下のコマンドで見つけられました。

$ find /usr/include/httpd/ -type f -print0 | xargs -0 grep 'ap_args_to_table'

これは、指定したディレクトリ内に含まれる文字列を検索するコマンドです。

こちらで詳しく説明されていますので、確認してください。

Apacheモジュール関係のヘッダファイルは /usr/include/httpd にあるので、そこの全ヘッダファイルに ap_args_to_table が含まれる出力だけを表示させます。

このコマンドの結果、以下が表示されました。

/usr/include/httpd/util_script.h:AP_DECLARE(void) ap_args_to_table(request_rec *r, apr_table_t **table);

やっと見つけた。。。

つまり、探していた ap_args_to_table  util_script.h にあるので、これをインクルードすればOKと言うことですね。

ライブラリの関数がどこにあるか探したくなった場合は、以下のコマンドで解決できると思います!

$ find ヘッダファイルのディレクトリ -type f -print0 | xargs -0 grep 探している関数

お試しください!

ちなみに、ライブラリによっては、 /usr/include ではなく /usr/local/include にヘッダファイルが入ることもあるのでお気をつけて