2016-12-14 8 views
0

以下のコードでコンパイルエラーが発生します。コンパイルエラー: '変更'の競合するタイプ - なぜですか?

#include <stdio.h> 

void modify(struct emp *y); 
struct emp 
{ 
    char name[20]; 
    int age; 
}; 
main() 
{ 
    struct emp e={"foo",35}; 
    modify(&e); 
    printf("\n%s%d",e.name,e.age); 
} 
void modify(struct emp *p){ 
    strupr(p->name); 
    p->age = p->age+2; 
} 

以下は、ビルドログメッセージの一部です。

エラー:「変更」の競合するタイプ|行番号。 15

注: 'modify'の前の宣言はここにありました|行番号。 3

+0

また、 'struct emp'が定義されていない、または宣言されていないというエラーまたは警告がありますか?それは問題だから。 –

+0

@Rhymoid未定義または宣言されていない構造体empのような警告はありません。 –

答えて

2

gccの理由を教えてください。

prog.c:3:20: warning: 'struct emp' declared inside parameter list 
void modify(struct emp *y); 
        ^
prog.c:3:20: warning: its scope is only this definition or declaration, which is 
         probably not what you want 

あなたはプロトタイプの順序や構造体の定義を変更するか、またはプロトタイプの前に構造体の宣言を追加します。

は、あなたの警告レベルを上げます。

+0

スコープがこのプロトタイプに限定されているのはなぜですか? –

+1

壊れたコードを目立つように修正する方法は他にありません。 Cは前後に読み取られます。コンパイラに情報が不足していると、先読みできません。 –

+0

@VaibhavGautamそれがルールなので。なぜこれがルールであるのかを知りたい場合は、ANSI委員会で議論のアーカイブをどこかに置くことができます。 – molbdnilo

1
は上向きに構造体を動かし

ので、あなたの関数プロトタイプはmain()の宣言が間違っているemp

struct emp 
    { 
     char name[20]; 
     int age; 
    }; 
    void modify(struct emp *y);  

    int main(void) 
    { 
     struct emp e={"foo",35}; 
     modify(&e); 
     printf("\n%s%d",e.name,e.age); 
     return 0; 
    } 
    void modify(struct emp *p){ 
     p->age = p->age+2; 
    } 
+1

@LPsチェックしてありがとう – izlin

1

知っています。機能should return an integerreturn 0;、および戻り値の型を明示的に指定する必要があります。

int main(void) 
{ 
    /* ... */ 
    return 0; 
} 

modify関数のプロトタイプが宣言されていない構造empに言及しています。つまり、プロトタイプの前にemp構造の宣言を置く必要があります。

strupris non-standard functionとして使用しないでください。

static関数が、現在のコンパイル単位内でのみと宣言されていることを考慮してください。

+0

あなたは 'main'の定義について間違っています。これは、明示的なreturn文を必要としない関数の1つです。 –

+0

@Rhymoid、大丈夫です。明示的に整数を返し、戻り値の型を指定する必要があります。 –

+1

「main」の形式についての嫌疑と誤った信念については、[read this](http://stackoverflow.com/a/31263079/584518)を参照してください。 'main()'はC90では有効ですが、フリースタンディング実装でも有効です。 C90では未定義の 'return 0'が定義されていませんが、それ以降の標準では有効です。 – Lundin

0

周囲の定義を移動すると、問題が解決されます。だれもまだ言及していないので、私はピッチでお答えします:

structと宣言されているフォワードの最小限の変更で修正することができます。

struct emp; // Forward declare struct emp before using it in the prototype. 
void modify(struct emp *y); 
関連する問題