首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于头文件被多次包含后引起的符号重定义异常

2012-09-03 
关于头文件被多次包含后引起的符号重定义错误考虑这样一个简单的项目,包含1个main文件,一个头文件,一个cpp

关于头文件被多次包含后引起的符号重定义错误
考虑这样一个简单的项目,包含1个main文件,一个头文件,一个cpp文件。
 ---- main.cpp

C/C++ code
#include "head.h"int main(){ func1();}

 ---- head.h
C/C++ code
//#pragma once#ifndef _HEADDDD#define _HEADDDD#include <iostream>using namespace std;int g_number;void func1();#endif 

 ---- func.cpp
C/C++ code
#include "head.h"void func1(){    cout<<"func1 "<<g_number<<endl;}


头文件head.h被包含了两次,结果导致g_number变量产生了重定义。

那么我想问问,#ifndef _HEADDDD这样的条件编译,或者#pragma once,到底是用来解决什么的?

如何才能在头文件中定义变量?(比如许多const变量肯定是想要在项目中的不同地方使用的)请不要告诉我写在cpp里然后用extern声明。

[解决办法]
C/C++ code
//#pragma once#ifndef _HEADDDD           //建议改为: #ifndef HEAD_H#define _HEADDDD#include <iostream>using namespace std;extern int g_number;               //头文件中一般只声明,在.cpp文件中定义void func1();#endif
[解决办法]
既然你都希望const变量在头文件中定义方便到处引用,你为何不把它改为const类型的,你试过吗?

还是自己动手吧,常量的定义当然可以放在头文件里面。
[解决办法]
探讨
补充问题:

1 既然有条件编译指令了,那么为什么中间的内容还是在不同模块被编译了2次最终导致符号重复?

2 假设我想在头文件里定义一个全局变量,在不同的cpp文件之间交叉访问,用extern的话显然不能方便的使用。因为我不知道应该在哪个cpp文件才去定义那个没有extern的实体。

热点排行