私のコンパイラ(GCC)は私に警告を出しています:
警告:関数の暗黙の宣言
なぜそれがやってくるのか理解するのを手伝ってください。
コンパイラがまだ宣言を見ていない関数( " prototype ")を使用しています。
例えば:
int main()
{
fun(2, "21"); /* The compiler has not seen the declaration. */
return 0;
}
int fun(int x, char *p)
{
/* ... */
}
次のように、直接またはヘッダでmainの前に関数を宣言する必要があります。
int fun(int x, char *p);
正しい方法は、関数プロトタイプをヘッダーで宣言することです。
main.h
#ifndef MAIN_H
#define MAIN_H
int some_main(const char *name);
#endif
main.c
#include "main.h"
int main()
{
some_main("Hello, World\n");
}
int some_main(const char *name)
{
printf("%s", name);
}
1つのファイル(main.c)を持つ代替案
static int some_main(const char *name);
int some_main(const char *name)
{
// do something
}
Main.cで#includeを実行するときは、#include参照をインクルードリストの一番上にある参照先の関数を含むファイルに配置します。例えばこれがmain.cであり、参照されている関数が "SSD1306_LCD.h"にあるとします。
#include "SSD1306_LCD.h"
#include "system.h" #include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include <math.h>
#include <libpic30.h> // http://microchip.wikidot.com/faq:74
#include <stdint.h>
#include <stdbool.h>
#include "GenericTypeDefs.h" // This has the 'BYTE' type definition
上記は「暗黙の関数宣言」エラーを生成しませんが、以下は
#include "system.h"
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include <math.h>
#include <libpic30.h> // http://microchip.wikidot.com/faq:74
#include <stdint.h>
#include <stdbool.h>
#include "GenericTypeDefs.h" // This has the 'BYTE' type definition
#include "SSD1306_LCD.h"
まったく同じ#includeリスト、順序が異なるだけです。
まあ、それは私のためにやった。
error: implicit declaration of function
を取得したら、問題のある関数もリストしてください。このエラーは多くの場合、忘れられたヘッダーファイルまたは見つからないヘッダーファイルが原因で発生します。したがって、シェルプロンプトでman 2 functionname
と入力して上部のSYNOPSIS
セクションを確認すると、含める必要があるヘッダーファイルが一覧表示されます。または http://linux.die.net/man/ を試してください。これはオンラインのmanページで、ハイパーリンクされていて検索が簡単です。多くの場合、ヘッダーファイルで関数が定義されています。必要なヘッダーファイルがあればその答えもよくあります。 cnicutarが言ったように、
コンパイラがまだ宣言を見ていない関数( "prototype")を使用しています。
正しいヘッダが定義されていて、非GlibC
ライブラリ( Musl C など)を使用している場合は、error: implicit declaration of function
などのGNU拡張子に遭遇するとgcc
もmalloc_trim
をスローします。
解決策は 拡張子とヘッダをラップする :
#if defined (__GLIBC__)
malloc_trim(0);
#endif
私は質問が100%答えられていないと思います。私はtypeof()が足りないという問題を探していました。これはコンパイル時の指令です。
以下のリンクは状況を明るく照らします。
https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Typeof.html
https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Alternate-Keywords.html#Alternate-Keywords
念のため、代わりに__typeof__()
を使用してください。 gcc ... -Dtypeof=__typeof__ ...
も役に立ちます。