「error conflicting types for function」コンパイルエラーの解析について

5790 ワード

gccを使用してCプログラムをコンパイルする場合、「error:conflicting types for‘function’」のコンパイルエラーが発生することがあります.文字通り、関数の定義と宣言が一致していないということです.この文章では、このエラーを簡単に分析します(gccバージョンは4.9.0を使用しています).(一)まず、関数の定義と宣言が一致しない例を見てみましょう.
#include 

int func(int a);

int func(void) {
    return 0;
}

int main(void) {

    func();

    return 0;
}
コンパイラ:
gcc -g -o a a.c
a.c:5:5: error: conflicting types for ‘func’
 int func(void) {
     ^
a.c:3:5: note: previous declaration of ‘func’ was here
 int func(int a);
「func」の宣言と定義が一致していない(パラメータがあり、ない)ため、コンパイル時にこのエラーが発生したことがわかります.
(二)最近、SolarisからLinuxに古いプログラムを移植しましたが、コンパイル中にもこのエラーが発生しました.しかし、ヘッダファイルでの関数の宣言と関数の定義が全く同じであることに気づきました.これは不思議です.1日近く調べた結果,関数パラメータタイプが関数宣言後に定義されたと結論した.簡略化されたコードは次のとおりです.
#include 

void func(struct A *A);

struct A {
        int a;
};

void func(struct A *A)
{
        printf("%d", A->a);
}

int main(void) {
        // your code goes here
        struct A a = {4};
        func(&a);
        return 0;
}
ここで「structure A」の定義は「func」関数宣言の後に置かれ、func関数のパラメータは「structure A*」タイプである.コンパイルの結果は次のとおりです.
gcc -g -o a a.c
a.c:3:18: warning: ‘struct A’ declared inside parameter list
 void func(struct A *A);
                  ^
a.c:3:18: warning: its scope is only this definition or declaration, which is probably not what you want
a.c:9:6: error: conflicting types for ‘func’
 void func(struct A *A)
      ^
a.c:3:6: note: previous declaration of ‘func’ was here
 void func(struct A *A);
      ^
「error:conflicting types for『func』」と出力されたコンパイルエラーも見られますが、コンパイル警告はヒントになるかもしれません.
プログラムのMakefileをチェックしてみましたが、すべてのコンパイル警告がオフになっています.コンパイル警告が多すぎるのかもしれません.