C 言語での関数の暗黙の宣言
このチュートリアルでは、C 言語のメイン関数の上に関数を宣言することにより、暗黙的な関数宣言の警告を削除する方法について説明します。
C 言語での関数の暗黙の宣言
コンパイラが C 言語での関数の暗黙的な宣言の警告を表示する場合があります。これは、関数が main()
関数の上で宣言されていないか、そのヘッダーファイルがインクルードされていないことを意味します。
たとえば、printf()
関数は stdio.h
ヘッダーファイルに属しており、C ソースファイルで使用する前にインクルードしないと、コンパイラは関数宣言が暗黙的であるという警告を表示します。
この場合、関数宣言を含むヘッダーファイルをインクルードするか、main()
関数の上に関数を宣言する必要があります。たとえば、ヘッダーファイルをインクルードせずに printf()
関数を使用してみましょう。
以下のコードを参照してください。
int main() {
int a = 10;
printf("a = %d", a);
return 0;
}
出力:
main.c: In function 'main':
main.c:5:5: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
5 | printf("a = %d",a);
| ^~~~~~
main.c:5:5: warning: incompatible implicit declaration of built-in function 'printf'
main.c:1:1: note: include '<stdio.h>' or provide a declaration of 'printf'
+++ |+#include <stdio.h>
1 |
a = 10
上記の出力では、コンパイラが printf()
関数の宣言が暗黙的であり、<stdio.h>
ファイルを含める必要がある、または次の宣言を提供する必要があるという警告を出したことがわかります。ソースファイルの printf()
関数。
また、a
の値が出力されていることもわかります。これは、ヘッダーファイルをインクルードしていなくても printf()
関数が完全に機能したことを意味します。
それでは、ヘッダーファイルをインクルードして、上記の例を繰り返しましょう。以下のコードを参照してください。
#include <stdio.h>
int main() {
int a = 10;
printf("a = %d", a);
return 0;
}
出力:
a = 10
printf()
関数のヘッダーファイルがインクルードされているため、今回は暗黙的な関数宣言の警告が表示されていないことがわかります。
ソースファイルに関数を作成したが、main()
関数の上で関数を宣言していない場合にも、暗黙的な関数宣言の警告が表示されます。
関数を呼び出そうとすると、コンパイラは関数宣言が暗黙的であることを警告します。たとえば、関数を作成し、main()
関数の上で宣言せずに main()
関数から呼び出しましょう。
#include <stdio.h>
int main() {
int a = fun(2, 3);
printf("a = %d", a);
return 0;
}
int fun(int x, int p) {
int a = x + p;
return a;
}
出力:
main.c: In function 'main':
main.c:4:13: warning: implicit declaration of function 'fun' [-Wimplicit-function-declaration]
4 | int a = fun(2, 3);
| ^~~
a = 5
上記の出力では、作成した関数に対して警告が表示されていることがわかります。この問題を解決するには、main()
関数の上に関数を宣言する必要があります。
たとえば、main()
関数の上で関数を宣言し、上記の例を繰り返します。以下のコードを参照してください。
#include <stdio.h>
int fun(int x, int p);
int main() {
int a = fun(2, 3);
printf("a = %d", a);
return 0;
}
int fun(int x, int p) {
int a = x + p;
return a;
}
出力:
a = 5
警告がなくなったことがわかります。関数をヘッダーファイルで宣言してから、ヘッダーファイルをソースファイルにインクルードすることもできます。これは、コードを簡素化するため、多くの関数の場合に役立ちます。