web-dev-qa-db-ja.com

警告:関数の暗黙の宣言

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

警告:関数の暗黙の宣言

なぜそれがやってくるのか理解するのを手伝ってください。

162
Angus

コンパイラがまだ宣言を見ていない関数( " 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);
193
cnicutar

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

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
}
16
Faizal Pribadi

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

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

5
tomc

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

コンパイラがまだ宣言を見ていない関数( "prototype")を使用しています。

3
Dwayne

正しいヘッダが定義されていて、非GlibCライブラリ( Musl C など)を使用している場合は、error: implicit declaration of functionなどのGNU拡張子に遭遇するとgccmalloc_trimをスローします。

解決策は 拡張子とヘッダをラップする

#if defined (__GLIBC__)
  malloc_trim(0);
#endif
2
Stuart Cardall

私は質問が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__ ...も役に立ちます。

0
Peeter Vois