a.h:#ifndef_KNIFE_ADT_H#define_KNIFE_ADT_HenumColor{red,greed,blue};typedefstructa{inta;doubleb;Colorc;}A_type;A_typeA_array[1024];//(1)intCount;voidfunc(A_typeA,Colorcolor_type)#endifa.c:#include"a.h"Count=0;//(2)voidfunc(A_typeA,Colorcolor_type){;}main.c:#include"a.h"intmain(){Count=0;return0;}问题:如上文件结构,编译会报重复定义的错误。在VS中,会报错.obj重定义。怎样处理最好?另外如(2),如果想要给.h文件中变量初始化,最合适的方法是?补充:1.将声明写在.C文件中,.h文件中只有enum枚举常量与结构体的声明,所有变量定义放在.c文件中:c1.h:#ifndef_KNIFE_ADT_H#define_KNIFE_ADT_HenumColor{red,greed,blue};structa;typedefstructaA_type;voidfunc(A_typeA,Colorcolor_type);#endifc1.c:#include"c1.h"structa{inta;doubleb;Colorc;};A_typeA_array[1024];//(1)intCount;voidfunc(A_typeA,Colorcolor_type){;}main.c:#include"c1.h"intmain(){Count=0;return0;}VS2012编译信息:1>c:\test\test_file\c1.cpp(4):errorC2380:“a”前的类型(构造函数有返回类型或是当前类型名称的非法重定义?)1>正在生成代码...1>正在编译...1>main.cpp1>c:\test\test_file\main.cpp(4):errorC2065:“Count”:未声明的标识符在头文件中声明intCount,即可消除最后一条编译错误信息。另外,在头文件中声明intCount后又在源文件中加上externintCount,有什么作用呢?具体用在哪些情景下?
2 回答
智慧大石
TA贡献1946条经验 获得超3个赞
Count=0;//(2)这句等同于:intCount=0;未声明类型的变量默认为整型,未声明返回值类型的函数默认为整型。所以你在这里又定义了一个Count变量。另外全局变量自动初始化为零,所以你这句没有用处。voidfunc(A_typeA,Colorcolor_type)这句末尾少了个分号。(1)处我看不出什么问题,你贴原始的报错信息吧。你描述的报错信息语焉不详。如果要初始化为常量,直接写在头文件里就可以了。如果要运行时初始化,只能写在一个函数里告诉别人先调用一下它。更新:如果你想在不同的编译单位(即单个的(被编译的).c文件)中共享一个变量,请声明变量的linkage为extern,即externintCount。另外,你的Color类型没有定义。被定义的叫enumColor。
添加回答
举报
0/150
提交
取消