博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
错误:“LNK1169找到一个或者多个重定义的符号”
阅读量:4303 次
发布时间:2019-05-27

本文共 809 字,大约阅读时间需要 2 分钟。

今天自己写了一个头文件,然后依照书上推荐的“声明和实现分离”方法,把类的成员函数写在头文件和head1.h里,然后把实现写在c1.cpp文件里。

class CXX{public:static int k;};

在类中,我声明了一个静态变量。开始怎么也无法使用,发生错误:LNK2001 无法解析的外部符号……

后来查资料才知道,是使用静态变量方法不对,使用静态变量必须在外部定义它才行。

class CXX{
...};
int CXX::k;

后来,代码越来越多,我就又写了另一个头文件head2.h,又写了一个c2.cpp文件,在这个cpp文件里,用到了head.1的类。

然后,编译的时候就出错了。

“LNK1169找到一个或者多个重定义的符号”

重定义?我仔细检查了,并没有发现重名的情况。我注意到编译信息里说的,好像正是我之前定义的那个静态变量!

我理解的是,因为重复引用头文件,导致定义了两次变量。

于是我试着在头文件前加上预编译指令:

#ifndef HEAD1#define HEAD1...#endif
这样来似乎能防止重复定义?
但是!!依然出错!!

为什么宏定义没有起作用?

为什么编译第二次的时候无视了预处理指令?

。。。

等等,无视?

我突然明白了,预处理指令只对当前文件起作用!在链接前,每个obj文件的生成都是互不相干的!

那这么一来,问题解决了。只需要把放在头文件里的变量定义移动到cpp文件即可。

原因是在引用头文件时,编译器是将头文件的全部放到cpp前,在两个cpp文件生成obj后,自然会有两次定义,但是放到cpp文件中,就没有问题了。

一般来说,头文件里最好只放声明,不放定义,除非某些特殊原因一定要放在头文件里(在另外一篇文里就会提到这种情况)。这好像又绕回了文章开头,声明就像一个多孔接口,大家都能用,但是接口的实现是只有一个的,如果有很多实现,就不知道该调用那个实现了。

转载地址:http://gvqws.baihongyu.com/

你可能感兴趣的文章
joplin笔记
查看>>
JNDI+springmvc使用
查看>>
vue+springboot分页交互
查看>>
vue+springboot打包发布
查看>>
[离散时间信号处理学习笔记] 13. 重采样
查看>>
关于使用用友华表Cell控件按需打印行的方法
查看>>
团队冲刺第二阶段-9
查看>>
使用泛型来比较数字类型的大小
查看>>
Android开发中,那些让您觉得相见恨晚的方法、类或接口
查看>>
XSL 开发总结
查看>>
VC++ 中使用内存映射文件处理大文件
查看>>
游记集合
查看>>
【spark】Spark环境配置
查看>>
windows phone (13) 样式继承
查看>>
擦亮眼睛,别做梦了:关于创业公司股份的真相
查看>>
.net core webApi 上传附件
查看>>
Hadoop 配置
查看>>
解决overflow: auto在Ios中滑动不流畅
查看>>
Linux内核分析 期中总结
查看>>
RHEL8.0-beta-1.ISO
查看>>