警告:関数の暗黙の宣言


201

私のコンパイラ(GCC)は私に警告を与えています:

警告:関数の暗黙の宣言

それが来る理由を教えてください。


1
A "なぜそれが誤り版与えるものではありません":stackoverflow.com/questions/434763/...
チロSantilli郝海东冠状病六四事件法轮功

これは、ヘッダーファイルを含めるのを忘れた場合にも発生します。たとえば、string.hを含めずにstrlen()を使用しようとすると、このエラーが発生します
kurdtpage

回答:


230

コンパイラがまだ宣言(「プロトタイプ」)を認識していない関数を使用しています。

例えば:

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);

9
また、プロトタイプを提供した場合、それが単なるタイプミスではないことを確認してください。また、外部ライブラリからのものである場合は、それが含まれていることを確認してください。
smitec

1
この警告が表示された後、コードを実行できません。したがって、エラーのように動作します。
ミエン2014年

@ Flimm、C99、およびC89 / C90の設定はこれとは異なります
Chen


1
@ZachSawそうですね。そうでなければ、あなたは自分自身を3回繰り返しなかったでしょう。
Nima Mousavi

19

正しい方法は、ヘッダーで関数プロトタイプを宣言することです。

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
}

7

#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リスト、順序が異なるだけです。

まあ、それは私のためにした。


3

あなたがerror: implicit declaration of functionそれを手に入れるとき、それはまた問題のある機能をリストするべきです。多くの場合、このエラーはヘッダーファイルの忘れや欠落が原因で発生するため、シェルプロンプトで上部にman 2 functionnameあるSYNOPSISセクションを入力して確認できます。このセクションには、含める必要のあるヘッダーファイルが一覧表示されます。または、http://linux.die.net/man/を試してください。これは、ハイパーリンクが設定されており、簡単に検索できるオンラインのmanページです。多くの場合、関数はヘッダーファイルで定義されています。cnicutarが言ったように、

コンパイラが宣言(「プロトタイプ」)をまだ認識していない関数を使用しています。



1

メイン関数の前に目的の関数を宣言する必要があります。

#include <stdio.h>
int yourfunc(void);

int main(void) {

   yourfunc();
 }

0

質問は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__ ...助けることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.