>> : error LNK2005: ×××× (★★★★) 已经在 ※※※.obj 中定义
通常是由于在.h文件里定义了此变量,移动到.cpp文件里即可。
并在使用到这个变量的cpp文件中加上extern int ID;
出错原因:
无意中遇到了这样的编译问题, 于是google,发现在.h文件里定义变量,发生这问题的概率是灰常大的.
下面这段红字是参考网上的说法:
当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义.
不过经过一轮研究发现.. 其实这说法不怎么正确.. 最起码对VS来说..
经过实验, 发现只要有两个cpp同时包含一个定义了变量的.h文件,就会提示错误.
再回想下刚 考完的编译原理,
正在链接...
1>3.obj : error LNK2005: "int i" () 已经在 2.obj 中定义
1>D:\编程之美\vs2008代码\dfsdfadsfec\Debug\dfsdfadsfec.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
本人得出的结论:
只要两个或者以上的.cpp同时包含了一个定义了变量的.h文件,就会提示错误.
不过注意, 这中间可能会包含些比较复杂的逻辑关系..
例如我的那坨代码..
假定一个定义了变量的1.h文件
有1.cpp和2.cpp, 1.cpp包含1.h,
在头文件和cpp文件错中复杂的情况下, 根本就很难判断其祸根源.
所以得出结论:
没事就别在.h中定义变量,或者初始化静态成员变量(我就是后一种情况).
不过有种比较酷的做法, 就是直接改成.c编译.