读书人

//为什么这样都还重复定义?该如何处理

发布时间: 2012-02-12 17:16:34 作者: rapoo

//为什么这样都还重复定义?
//=======================main.cpp

#include <iostream>
using namespace std;

#include "Global.h "

int main()
{
cout < < "Test ";
}

//=====================Global.h

#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

bool a=false; //为什么这样都还重复定义?
bool b=false;

#endif

//=======================Test.cpp

#include <iostream>
using namespace std;

#include "Global.h "

[解决办法]
因为c++就这么规定的。
不可以在.h里定义变量,因为就是会触发这个重复定义错误。
你只能在.h里用extern bool a;这样声明变量。
[解决办法]

这样做

//=====================Global.h

#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

extern bool a;
extern bool b;

#endif


//=====================Global.cpp

bool a = false;
bool b = false;

[解决办法]
因为你在main.cpp 和 Test.cpp 里都 #include "Global.h "

了,所以定义了两次
[解决办法]
#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

#endif

不 要理解错了,上面是防止头文件被重复包含的, 防止重复定义还要靠自己
[解决办法]
#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

#endif

对呀,既然 防止头文件被重复包含 ,那么只包含一次的话不就不会重复定义了

----------


因为你在main.cpp 和 Test.cpp 里都 #include "Global.h "

了,所以定义了两次

[解决办法]
按着你的意思我看可以用
//=====================Global.h

#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

static bool a=false; //为什么这样都还重复定义?
static bool b=false;

#endif

[解决办法]
按着你的意思我看可以用
//=====================Global.h

#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

static bool a=false; //为什么这样都还重复定义?
static bool b=false;

#endif


-------


不行!!只能按去前面说的做,看来你不太理解 #include

#include 是把后面的文件展开 就是static了,展开后还是两份
[解决办法]
static 后编译应该是可以过的,但已经不是你要的东西了

它为每个include它的文件生成一份数据
[解决办法]
编译是对每个.cpp文件做的操作

你这个重复定义可以通过编译, 但是在将多个.cpp编译出来的.obj文件链接成一个exe文件时
就会有同一个变量在几个obj中都有定义, 这样就出错了, 链接器不知道到底该链接哪个定义的变量
[解决办法]
按着你的意思我看可以用
//=====================Global.h

#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

static bool a=false; //为什么这样都还重复定义?
static bool b=false;

#endif


-------


不行!!只能按去前面说的做,看来你不太理解 #include

#include 是把后面的文件展开 就是static了,展开后还是两份


-------------

理论固然重要,但要明白用户要求!虽然我不太清楚,只能猜测楼主想在一开始就给a、b付值,而且“#include 是把后面的文件展开 就是static了,展开后还是两份”,应该实践一下,对理论理解可能会有偏差。而且依据楼主定义不可能在同一文件中定义被包含2次!结论如何还是试验一下才下结论比较好。


[解决办法]
ls

依我理解,lz 可能想要的是全局变量,其它cpp共享的一对全局变量

如果加了static 就变成文件内共享的变量了

其实还是看lz的意图,等lz来说吧

不过,个人认为在.h里定义static变量实在太诡异了 :)
[解决办法]
不好意思,仔细考虑后还是觉得extern比较合适。
[解决办法]
这个做法本身就不可取。
全局变量的定义就应当放在C文件里。
然后在H文件里,用extern做外部声明。
在需要用这个变量的源文件里包含上面这个H文件。
[解决办法]
补充:

#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

#endif
这个只能防止你在一个源文件里,重复包含了头文件。

但是,你的情况是,有好几个源文件都各自包含了这个头文件,那么,当然,头文件里的变量就在几个源文件里都定义了——这难得还不是清楚明了、小葱拌豆腐的重复定义吗?
[解决办法]
#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

#endif
这个可以防止在一个CPP中引用多个套用的.h文件的时候重复引用一段定义
但是不能防止多个CPP各自引用
static bool a=false;
static bool b=false;

你的程序中存在test.cpp和main.cpp
这两个cpp都分别包含了global.h,所以两个cpp编译以后,.obj文件中分别各自包含一个static形态的a和b变量
于是造成了重复定义


-------------------------------------------------------
广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711


[解决办法]
//=====================Global.h

#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

#endif

// 这个只是用来防止Global.h被重复inlcude,在循环递归include中。

//=======================main.cpp

#include <iostream>
using namespace std;

#include "Global.h "

int main()
{
cout < < "Test ";
}

// main.cpp中无GLOBAL_DEFINE的定义,故包含Global.h,从而定义了a和b。

//=======================Test.cpp

#include <iostream>
using namespace std;

#include "Global.h "

// 同理Test.cpp中无GLOBAL_DEFINE的定义,故包含Global.h,从而定义了a和b。
// a和b定义了两次,不是重复定义是什么?

假想你自己是compiler,那么你的程序pre-processe后是什么结果,然后你再来做词法分析又是什么结果。

[解决办法]
//=====================Global.h

#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

#endif

上面这段代码是预防下面这种情况的。

#include <iostream>
using namespace std;

#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "


#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "
#include "Global.h "

int main()
{
cout < < "Test ";
}

希望能给楼主深刻印象。
[解决办法]
#ifndef GLOBAL_DEFINE
#define GLOBAL_DEFINE

#endif

宏定义是局部有效的,就是在同一个编译单元中,也就是一个cpp文件。
另外一个cpp文件再次判断#ifndef GLOBAL_DEFINE仍然会为TRUE。

你再不明白就太傻了。

读书人网 >C++

热点推荐