2016-12-14 36 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

注:以前的'修改'聲明在這裏|在線路號碼。 3

+0

是否還有一個錯誤或警告'struct emp'未定義或未聲明?因爲那很重要。 – 2016-12-14 10:45:47

+0

@Rhymoid沒有像undefined或undeclared struct 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從前到後讀取。如果編譯器缺少信息,則無法向前看。 – 2016-12-14 10:56:23

+0

@VaibhavGautam因爲這是規則。如果你想知道爲什麼這是規則,那麼ANSI委員會可能會在某處存在討論檔案。 – molbdnilo

1

向上移動的結構讓你的函數原型知道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

main()的聲明是不正確。功能should return an integerreturn 0;,並返回類型應明確規定:

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

功能提到未申報的結構emp。換句話說,您應該在原型之前放置emp結構的聲明。

避免使用strupr因爲它is non-standard function

考慮聲明函數static,如果它們應該在當前編譯單元中被使用只有

+0

您錯誤地定義了'main'。這是一個不需要顯式返回語句的函數。 – 2016-12-14 10:55:05

+0

@Rhymoid,好的,它應該顯式地返回整數,並且返回類型_應該被指定。 –

+1

關於rants和不正確的相信'main'的格式,[閱讀此](http://stackoverflow.com/a/31263079/584518)。 'main()'在C90以及所有獨立實現中都是有效的。缺少'return 0'在C90中是未定義的行爲,但在後來的標準中有效。 – Lundin

0

移動定義將解決您的問題。但由於目前還沒有人提到,所以我會介紹:

你可以用最小的改變來修正它,聲明struct

struct emp; // Forward declare struct emp before using it in the prototype. 
void modify(struct emp *y);