a multiple of 3definition of问题求教

c&& 变量的重复定义问题 &multiple definition of& 与模板类
这两天开始慢慢复习c++基础知识和数据结构的内容了。因为马上各种实习生招聘就开始啦。吼吼。
以前在学c++的时候,没太仔细学模板类,用的时候也很少。我想复习的时候,好好看看。结果,在用模板类实现链表的时候,出问题了。
问题1.编译出错
老规矩,四个文件 node.h,node.cpp, list.h, list.cpp。结果在编译的时候(见makefile文件),总是出问题。查了一下,原因是模板类不能分离编译。于是,只能把类定义和类实现放在同一个文件里。
问题2.全局变量
问题1中,把内容放在同一个文件中,可以了。但是,如果需要在该文件定义了全局变量,怎么办啊?
问题1中,我吧内容都放在了node.cpp 和list.cpp中,因为没有全局变量,所以,include cpp文件不会出神马问题,编译运行都通过。但是,现在如果定义了全局变量,再include cpp文件的话,就会出现多次定义的问题。
如果把node.cpp和node.h中的内容都写到node.h中,又会导致编译不太办。因为编译是基于.cpp的嘛。
解决办法:
1.把 node.cpp中的全局变量声明成static,这是因为static仅在本文件中生效。因此,如果多次include,会多次定义相同的变量,但每个变量的生存范围还是自己的文件。这个方法仅适用于 该变量是常量只读的情况。
2.写一个global.h 文件。把刚才的node.cpp中的问题全部放到这里。只不过,在global.h中,对全局变量仅仅是声明,即需要在每个变量前加extern,然后写一个global.cpp文件,对每个变量进行定义。然后在其他的cpp中 include“global.h文件就好了。问题解决。
基础知识以前就不怎么熟悉,慢慢练习,加深理解。加油。
刚才问了一个同学,说.cpp和.h可以分离编译,显示实例化模板。方法如下:
/* compare.h */
#ifndef __COMPARE_H__
#define __COMPARE_H__
template &class T&
class Compare {
bool operator()(const T& a, const T& b)
struct Weight {
/* compare.cpp */
#include "compare.h"
template &class T&
bool Compare&T&::operator()(const T& a, const T& b) const {
return a & b ? true :
static bool operator&(const Weight& a, const Weight& b) {
return a.weight & b.weight ? true :
template class Compare&int&;
template class Compare&double&;
template class Compare&Weight&;
/* main.cpp */
#include &iostream&
#include "compare.h"
int main() {
cout && Compare&int&()(1, 2) &&
cout && Compare&double&()(2.0, 1.0) &&
a.weight = 1;
b.weight = 2;
cout && Compare&Weight&()(a, b) &&
重要的3行我用红颜色标注了。在分离编译时,如果没有这三句话,会报 undefined reference to ***。原因是根据.h和main.cpp文件 编译器无法实例化模板的实现。有了这三句,编译器就事先实例化这几种类型。然后链接就不会出错了。
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.054 (s). 12 q(s)QT工程x.pro,
qmake &x.pro生成Makefile,
最后生成目标文件时,连接出错:
“(.text+0x0): multiple definition of ”的错误,查找,有原因是因为#include &.cpp/.c&,检查代码,不是此问题。
用nm & 编译的文件.o,未现出多个相同的方法名。
检查Makefile,发现2处理相同的 & .o编译配置,相同的cpp编译成相同的.o。
检查x.pro,发现2处理相同的 & .cpp文件。
修改x.pro,删除其中一处理,
编译通过。
后继,对比两次生成的.o,大小相同, nm两次生成的.o,输出的信息相同(不知道编译器如何区别出来 ,TODO: )
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:390次
排名:千里之外The C++ Programming Language(79)
问题原因:
&&& 当多个文件包含同一个头文件时,并且你的.H里面没有加上条件编译
#ifndef TEST_H
#define TEST_H
就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。
&&& 给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释,这是个应该是习惯。这个方法会解决大部分低级问题。
&&& 当方法1无效时,可以把所有的全局变量放入一个头文件 global.h (名字随意起,但要加条件编译)中,每一个变量前面加extern,声明一下这些变量将在其它文件中定义。 然后建立一个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明所有的全局变量。例如:void(*Handl_Display)();
然后,让涉及到全局变量的文件include ”global.h“。这样编译时,会先对global.c编译生成一个global.o ,然后再和其它文件的.o链接生成可执行文件。
& & 在所有的全局变量前加上static ,声明成静止变量。也能解决问题。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:157857次
积分:5702
积分:5702
排名:千里之外
原创:434篇
转载:62篇
评论:48条
文章:95篇
阅读:18491
文章:109篇
阅读:50802
文章:134篇
阅读:35801}

我要回帖

更多关于 multiple definition 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信