两个.h文件中的同名static变量:redefinition error!

LeonTown 2009-12-14 05:47:19
我在两个头文件中分别定义两个用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修饰的变量,其作用域限制在当前文件中吗?
上面的重定义的错误是为什么啊?
...全文
326 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
星爷是我哥 2012-01-13
  • 打赏
  • 举报
回复
namespace
mstlq 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 leontown 的回复:]
谢谢楼上的解释!
我基本上明白了。。。

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

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

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

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

[/Quote]

这个时候,该轮到namespace出场了……
freshui 2009-12-14
  • 打赏
  • 举报
回复
定义一定要放在c文件里面

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

这虽然不是绝对必须的规则,但是要写规范的问题少的c/c++,必须这样做
dijkstar 2009-12-14
  • 打赏
  • 举报
回复
切忌:定义变量绝对不能放在头文件中,而是应该放在cpp文件中!!这是原则。

头文件中只能放一些
#include ......
#define .....
#ifdef ....
extern int xxxx;
等等之类的声明语句!
capoatguitar 2009-12-14
  • 打赏
  • 举报
回复
把 static int g_test; 改个名,一个头文件里一个.
LeonTown 2009-12-14
  • 打赏
  • 举报
回复
谢谢楼上的解释!
我基本上明白了。。。

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

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

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

或者这样
#ifdef AH
    #include "a.h"
#else
    #include "b.h"
#endif
[/Quote]
aozhi 2009-12-14
  • 打赏
  • 举报
回复
#include 是编译前把头文件copy到指定的位置。
按lz的例子,两个变量的作用域是一样的,肯定编译不过。
如果这样就可以了。

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

或者这样
#ifdef AH
#include "a.h"
#else
#include "b.h"
#endif
lie1213 2009-12-14
  • 打赏
  • 举报
回复
定义你自己的名称空间 将它放进去。
pengzhixi 2009-12-14
  • 打赏
  • 举报
回复
所谓的作用域限制是指源文件而不是头文件
pur_e 2009-12-14
  • 打赏
  • 举报
回复
#include 是包含,头文件不单独编译

static修饰的变量,其作用域限制在当前文件,意思是两个.o文件,也就是cpp文件编译后各自一个.o文件
太乙 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 leontown 的回复:]
我在两个头文件中分别定义两个用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修饰的变量,其作用域限制在当前文件中吗?
上面的重定义的错误是为什么啊?
[/Quote]


因为你include了这个头文件,所以,当前文件就是你的main,那么你的main.cpp里将有俩同名static变量!
头文件是不参与编译的,只是包含到cpp中编译!

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧