静态全局变量的问题

5204711353 2005-01-02 01:55:23
我在h1这个文件中是这样写代码的~
#ifndef h1
#define h1
static int i=2;
fun()
{
}
#endif

在cpp文件中是这样写
#include <h1.h>
#include <iostream.h>
int main()
{
cout<<i;
return 0;
}
为什么通过编译cpp会输出2~
我觉的不应该是2应该报错~我定义的是静态全局变量~变量只应该限制在定义变量的文件中
其他文件引用该变量应该报错
为什么不报错啊~还请高手给我解释下~
...全文
298 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hewittlee 2005-01-04
  • 打赏
  • 举报
回复
因为你已经include了
melonliu 2005-01-03
  • 打赏
  • 举报
回复
其本质是一个单文件工程啊
e5022 2005-01-03
  • 打赏
  • 举报
回复
头文件是不算作一个真正的源文件的,而.cpp文件才是一个完整的单元文件,单元文件之间的静态变量引用会出问题吧。
angeldai 2005-01-03
  • 打赏
  • 举报
回复
1, 一个文件中的全局static变量的作用域是这个文件,它是这个文件私有的变量。它不能在其他文件中声明为extern变量使用。

2, 如果使用include语句,表明在编译之前被include的文件已经和当前文件成为同一个文件了,编译器已将include的文件内容复制到了当前文件中。被include的文件可以是*.h,*.cpp,*.c

3,所以当你在h1.h文件中定义了static int i=2; 在h1.cpp中include文件h1.h,那么此时全局静态变量i也成为了h1.cpp文件的私有变量。如果多个*.cpp文件include文件h1.h,那么全局静态变量i成为了这些*.cpp各自的私有变量,各管各的,互不影响。

4,一般我们定义变量应该在*.cpp或*.c文件中,而在*.h文件中只是声明一些全局变量、函数或符号。比如:

在h1.cpp中定义全局变量
int a = 5;

在h1.h中声明全局变量
extern int a;
RedTear1021 2005-01-03
  • 打赏
  • 举报
回复
up
xuelong_zl 2005-01-03
  • 打赏
  • 举报
回复
mark
CMyMfc 2005-01-03
  • 打赏
  • 举报
回复
变量定义最好在.c or .cpp文件中, 程序文件定义, 头文件声明
gameboy007 2005-01-03
  • 打赏
  • 举报
回复
#ifndef h1
#define h1
namespace { static int i=2; }
fun()
{
}
#endif
diandian82 2005-01-03
  • 打赏
  • 举报
回复
都包含进来了,还报什么错呀!
cxc014 2005-01-02
  • 打赏
  • 举报
回复
各管各
pukkah 2005-01-02
  • 打赏
  • 举报
回复
有个问题,有多个Cpp文件引用这个头文件时,都访问这个i时会有什么效果
phpxer 2005-01-02
  • 打赏
  • 举报
回复
.h的文件C++编译时嵌入到包含它的文件中去
oyljerry 2005-01-02
  • 打赏
  • 举报
回复
编译的时候,会包含进自己h文件内容的
fairyme 2005-01-02
  • 打赏
  • 举报
回复
是不可能报错的
libbyliugang 2005-01-02
  • 打赏
  • 举报
回复
#include 某文件
就是将该文件的内容全部复制到当前文件中。
newegg2002 2005-01-02
  • 打赏
  • 举报
回复
在一个*.cpp的文件里,声明为static的变量是不能在另一个文件中引用的...
你那个是*.h文件...
liem 2005-01-02
  • 打赏
  • 举报
回复
#ifndef h1
#define h1
static int i=2;
fun()
{
}
#endif
这不会报错。因为static全局变量是局部的连接性,其它文件是不能访问的。
blueskyzsz 2005-01-02
  • 打赏
  • 举报
回复
在预编译的时候,编译器会把h1.h中的内容写到 包括这个头文件的cpp文件前面
所以,编译之前,这个文件已经变成了

#ifndef h1
#define h1
static int i=2;
fun()
{
}
#endif

#include <iostream.h>
int main()
{
cout<<i;
return 0;
}

所以编译的时候 i 是在这个cpp文件中定义的
5204711353 2005-01-02
  • 打赏
  • 举报
回复
那样怎么做呢?请大哥指教下
zhangqiushuang 2005-01-02
  • 打赏
  • 举报
回复
但引用i的不是其他文件啊。

64,439

社区成员

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

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