error lnk 1169错误的解决办法

来源:互联网 发布:致远互联软件 编辑:程序博客网 时间:2024/05/17 23:38

问题背景描述


最近工作时,遇到了这个错误,我在一个头文件bkdrhash.h中定义了一函数

#ifndef _____H#define ----Hsize_t BKDRhash(char * pch){......}#endif

当我第一次使用这个函数时候,直接用#include”bkdrhash.h“,没出现错误。当我又在同一个工程的另一个cpp文件中使用时,编译阶段出现了error lnk 1169,找到一个或多个重定义的符号,当时我就懵了,不是加了#ifndef-#endif了吗,怎么还是出这样的错误呢?

问题的解决


上网查了一番资料后,我把函数的定和义实现分开,分别放在头文件里和cpp文件里。

//bkdrhash.h#ifndef _____H#define -----Hsize_t BKDRhash(char * pch);#endif
//rkdrhash.cpp#define"rkdrhash.h"size_t BKDRhash(char * pch){......}

这样把函数的定义和实现分离之后,其他函数再调用以上函数时,就没出现该链接错误了,至此我终于明白了两点:

  1. 为什么会出现多次重定义的错误,原因在于原来直接在头文件(.h)里定义了函数,其他文件在include时,直接把该函数的实现插入了该文件中,只引用一次还好,如果超过1次,则会把同一份代码拷贝到多个文件中,这样就出现了多个同名的函数,当然这!就!是!多重定义了!!!。编译时能通过,因为没有语法错误,然而链接时就会出错。
  2. 为什么#ifnde – #endif没起作用,原因在于这组命令只会使得该头文件不会被同一个文件包含多次,从而防止出现以上多重定义的错误,然而把函数定义在头文件中,而不同的文件里引用该函数定义的头文件时,就一定会出现lnk 1169错误,原因就在于第1条解释的那样,而声明放在头文件里,其他文件引用时,只是得到仅有的一个函数声明,而不是一个函数定义。

收获


看似一个很寻常的错误,我不仅走运地解决了问题,而且还分析出了错误出现的原因。原来读书没体会到的函数的声明,定义分开的作用竟然还有这样的原因,而一直认为只是出于保密的需要,不给其他人看具体实现才分开的。以后我会谨遵这个教训,坚决把定义和实现分离!