读书人

两个.h文件中的同名static变量:redef

发布时间: 2012-02-11 09:51:35 作者: rapoo

两个.h文件中的同名static变量:redefinition error!
我在两个头文件中分别定义两个用static修饰的同名变量:

a.h
static int g_test;

b.h
static int g_test;

main.cpp
#include "a.h"
#include "b.h"


编译main.cpp时还是提示redefinition错误!

不是说static修饰的变量,其作用域限制在当前文件中吗?
上面的重定义的错误是为什么啊?

[解决办法]

探讨
我在两个头文件中分别定义两个用static修饰的同名变量:

a.h
static int g_test;

b.h
static int g_test;

main.cpp
#include "a.h"
#include "b.h"


编译main.cpp时还是提示redefinition错误!

不是说static修饰的变量,其作用域限制在当前文件中吗?
上面的重定义的错误是为什么啊?

[解决办法]
#include 是包含,头文件不单独编译

static修饰的变量,其作用域限制在当前文件,意思是两个.o文件,也就是cpp文件编译后各自一个.o文件
[解决办法]
所谓的作用域限制是指源文件而不是头文件
[解决办法]
定义你自己的名称空间 将它放进去。
[解决办法]
#include 是编译前把头文件copy到指定的位置。
按lz的例子,两个变量的作用域是一样的,肯定编译不过。
如果这样就可以了。

if(条件)
{
#include "a.h"
}
else
{
#include "b.h"
}

或者这样
#ifdef AH
#include "a.h"
#else
#include "b.h"
#endif
[解决办法]
把 static int g_test; 改个名,一个头文件里一个.

[解决办法]
切忌:定义变量绝对不能放在头文件中,而是应该放在cpp文件中!!这是原则。

头文件中只能放一些
C/C++ code
#include ......#define .....#ifdef ....extern int xxxx;
[解决办法]
定义一定要放在c文件里面

只有类型(如类和结构体)的定义和申明才能放在h文件中,
inline的函数定义也可以放在.h文件中,其它定义一定只能放在C中

这虽然不是绝对必须的规则,但是要写规范的问题少的c/c++,必须这样做
[解决办法]
探讨
谢谢楼上的解释!
我基本上明白了。。。

这里的方案似乎只能包含一个文件,
但我需要两个文件都包含,
这样的实现应该不能满足需求吧。。。

引用:
#include 是编译前把头文件copy到指定的位置。
按lz的例子,两个变量的作用域是一样的,肯定编译不过。
如果这样就可以了。

if(条件)
{
    #include "a.h"
}
else
{
    #include "b.h"
}

或者这样
#ifdef AH
    #include "a.h"
#else
    #include "b.h"
#endif

读书人网 >C++

热点推荐