关于在头文件中的一个错误

小班得瑞 2012-01-10 10:54:52
使用的编译器是VS2010,一个solution下包含了2个h文件和3个cpp文件。
我在a.h(名字太长,我简化为头文件a)中定义了一个const变量
extern const int nLevel = 256;
然后在main.cpp里包含a.h,编译一切正常,链接给出错误,链接信息如下:
a.obj : error LNK2005: "int const nLevel" (?nLevel@@3HB) already defined in main.obj
1>F:\编程语言\OpenCV\HelloOpenCV\Debug\HelloOpenCV.exe : fatal error LNK1169: one or more multiply defined symbols found

问题是,我在main.cpp里根本就没有再定义该变量,我搜索也没有找到,我让我同学帮我找,他也没在除了a.h外的其他地方找到了声明nLevel的地方。好奇怪啊。
然后,我把extern const int nLevel = 256;注释掉
//extern const int nLevel = 256;
改为#define nLevel 256(在a.h里)
然后链接正确了。
我不知道是什么原因啊,求指教
...全文
97 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
薛定谔之死猫 2012-01-11
  • 打赏
  • 举报
回复
语言教材上有说extern和static的用法的,你看一眼就能理解它了
薛定谔之死猫 2012-01-11
  • 打赏
  • 举报
回复
不是重定义,是编译器根据extern认定nLevel在其它编译单元(也就是最终编译成.obj的)中有这个定义了,结果再整个连接过程中没有找到,所以就报这个错误了
小班得瑞 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mscf 的回复:]

extern指定的是在其它编译单元定义的变量,include头文件后就合成同一编译单元了,要么extern去了,要么在其它cpp中定义非extern描述的nLevel变量
[/Quote]意思是不是说,编译器误以为在其他的文件里已经有了nLevel的定义,而在a.h里用extern声明是为了要在此使用该变量,所以产生了“重定义”?
gqjjqg 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 anyidan 的回复:]

你在别的文件中 #include "a.h" 了

extern const int nLevel = 256; //有初始化变为定义
[/Quote]

来晚了只能找正确答案支持一下。

AnYidan 2012-01-11
  • 打赏
  • 举报
回复
你在别的文件中 #include "a.h" 了

extern const int nLevel = 256; //有初始化变为定义

一鸣惊人 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mscf 的回复:]
不是重定义,是编译器根据extern认定nLevel在其它编译单元(也就是最终编译成.obj的)中有这个定义了,结果再整个连接过程中没有找到,所以就报这个错误了
[/Quote]
+
薛定谔之死猫 2012-01-10
  • 打赏
  • 举报
回复
extern指定的是在其它编译单元定义的变量,include头文件后就合成同一编译单元了,要么extern去了,要么在其它cpp中定义非extern描述的nLevel变量

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧