免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 15647 | 回复: 12
打印 上一主题 下一主题

[C++] 多个cpp源文件 include同一个头文件出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-26 21:34 |只看该作者 |倒序浏览
写了一个C++程序 其中有两个源文件include同一个头文件 虽然使用了#ifndef命令 但仍是报错 望大神指点
头文件 my_head1:
void read_data(void);
void write_data(void);
void randd(void);
头文件 my_head2:
#ifndef _my_head2_
#define _my_head2_
#include<fstream>
using namespace std;

ifstream readd;
ofstream writed;
#else
extern ifstream readd;
extern ofstream writed;
#endif
源文件 read_data:
#include<fstream>
#include<iostream>
#include"my_head2.h"
using namespace std;

void read_data()
{
        readd.open("datamem.txt");
        if(readd==NULL) {cout<<"Read datamem.txt error!"<<endl;exit(0);}
        int num;       
        while(1){
                readd>>num;
                if(!readd.eof()) cout<<num<<" ";
                else break;
        }
        readd.close();
//        readd.clear();
}
源文件write_data:
#include<fstream>
#include<iostream>
#include"my_head2.h"
using namespace std;

void write_data()
{
        writed.open("datamem.txt");
        if(writed==NULL) {cout<<"Write datamem.txt error!"<<endl;exit(0);}
        int i;
        for(i=0;i<20;i++)
                writed<<i<<" ";
        writed.close();
//        writed.clear();
}
顶层文件:
#include<stdlib.h>
#include"my_head1.h"

void main()
{
        write_data();
        read_data();
}

错误提示:
1>write_data.obj : error LNK2005: "class std::basic_ifstream<char,struct std::char_traits<char> > readd" (?readd@@3V?$basic_ifstream@DU?$char_traits@D@std@@@std@@A) 已经在 read_data.obj 中定义
1>write_data.obj : error LNK2005: "class std::basic_ofstream<char,struct std::char_traits<char> > writed" (?writed@@3V?$basic_ofstream@DU?$char_traits@D@std@@@std@@A) 已经在 read_data.obj 中定义
1>C:\Users\Flyingsheep\Desktop\old_program\C++_test\test_include2\test_include\Debug\test_include.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

不知道为什么 望大神指点啊

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2012-11-26 21:47 |只看该作者
不出错才怪,你的源文件又不是合成为一个文件编译的,而是一个一个编译的,出现多个实体很正常。

论坛徽章:
0
3 [报告]
发表于 2012-11-26 21:55 |只看该作者
如何才能合成为一个文件编译,对这方面不太懂


   

论坛徽章:
0
4 [报告]
发表于 2012-11-26 21:56 |只看该作者
如何才能合成为一个文件编译,对这方面不太懂回复 2# lost_templar


   

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
5 [报告]
发表于 2012-11-26 22:06 |只看该作者
别在头文件里定义全局变量,这是愚蠢的行为。

用一个单独的cpp文件包含进头文件,在这个cpp里定义全局变量;头文件里做外部声明。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2012-11-26 22:07 |只看该作者
回复 4# flyingsheep89

是你的头文件的问题,如果你只有一个源文件这样做是可以的。

你的头文件应该只有 extern xxxx;

而定义 xxx 应该放在一个源文件中。

   

论坛徽章:
0
7 [报告]
发表于 2012-11-26 22:16 |只看该作者
那现在的程序到底错在哪呢?回复 5# selfrun


   

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
8 [报告]
发表于 2012-11-26 22:22 |只看该作者
建立一个variant.cpp文件:

#include <fstream>
using namespace std;
ifstream readd;
ofstream writed;


-------------------------------------------------
头文件my_head2改成:
#ifndef _my_head2_
#define _my_head2_
#include<fstream>
extern ifstream readd;
extern ofstream writed;

论坛徽章:
0
9 [报告]
发表于 2012-11-26 22:32 |只看该作者
好像不行啊 我把my_head2包含进去错误很多回复 8# selfrun


   

论坛徽章:
0
10 [报告]
发表于 2012-11-26 22:35 |只看该作者
把my_head2改为#ifndef _my_head2_
#define _my_head2_
#include<fstream>
using namespace std;
extern ifstream readd;
extern ofstream writed;
#endif
依旧报同样的错误回复 8# selfrun


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP