2016-12-14 39 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);