回答:
コンパイラがまだ宣言(「プロトタイプ」)を認識していない関数を使用しています。
例えば:
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
}
#includesをmain.cで実行する場合、参照先の関数を含むファイルへの#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が言ったように、
コンパイラが宣言(「プロトタイプ」)をまだ認識していない関数を使用しています。
正しいヘッダーが定義されていて、非GlibC
ライブラリ(Musl Cなど)gcc
を使用しているerror: implicit declaration of function
場合も、などのGNU拡張機能が検出されたときにスローされ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__ ...
助けることができます。