一个C的全局变量的小问题,请教

cy010510630 2010-10-16 10:13:54
//---------文件分隔符---------

//globe.cpp
int globe = 100;

//---------文件分隔符---------

//globe.h
extern int globe;

//---------文件分隔符---------

//func.cpp
#include"globe.h"
int func()
{
return 0;
}
globe = 0;//如果将此行放到函数func内部,就不会报错

//---------文件分隔符---------

//main.cpp
#include"globe.h"
int func();
int main()
{
func();
return 0;
}

//---------文件分隔符---------



编译无法通过,错误信息如下:
Compiling...
main.cpp
test1.cpp
D:\my program\VCproject\consoleTest1\test1.cpp(12) : error C2501: 'globe' : missing storage-class or type specifiers

但是如果将程序中注释那部分,即修改全局变量的语句放到函数func内部,则编译通过。
请问为什么?
我觉得应该两种方法都能通过编译的?
...全文
181 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cy010510630 2010-10-17
  • 打赏
  • 举报
回复
各有各的解释与理解吧,我个人觉得5楼的更容易让我记住理解。
void_wuyu,很是感谢你的解答
大牛~Daniel 2010-10-17
  • 打赏
  • 举报
回复
很明显听5楼的!up
cy010510630 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 litolyan 的回复:]
三楼的很正确哦
[/Quote]

但是我搜索了“全局变量 赋值”关键字
得到的很多答复是:
globe = 0;
这个不是初始化,是一般的赋值语句。所有的语句都必须写在函数内。
litolyan 2010-10-17
  • 打赏
  • 举报
回复
三楼的很正确哦
熊熊大叔 2010-10-16
  • 打赏
  • 举报
回复
globe = 0;
这个不是初始化,是一般的赋值语句。所有的语句都必须写在函数内。
zecard_fu 2010-10-16
  • 打赏
  • 举报
回复
很简单 你见过在一个文件中这样写的吗?


int globe = 100;
globe = 10;
int main()
{
printf(...);
}
乐CC 2010-10-16
  • 打赏
  • 举报
回复
extern int globe;
写在globe.h里,而赋值操作写在func.cpp中,你的main.cpp没有地方执行globe = 0,而编译的时候,将globe到底指向哪并没有确定,所以globe的地址并不确定,从main入口时,无法完成globe的地址查找,当然编译不通过,而放到func中的时候,从main入口调用它可以很容易知道需要执行赋值操作,从而从自己头文件中找到地址:
//main.cpp
#include"globe.h"
int func();
int main()
{
func();
return 0;
}
总结来说,globe=0并没有依赖自己包含的头文件:
//func.cpp
#include"globe.h"
int func()
{
return 0;
}
globe = 0;
而是依赖调用执行这句语句的文件包含的头文件,明白了么?
大拙男 2010-10-16
  • 打赏
  • 举报
回复
在func.cpp里面加个extern int globe试试
小魔菇 2010-10-16
  • 打赏
  • 举报
回复
文件结构没看明白
cy010510630 2010-10-16
  • 打赏
  • 举报
回复
是不是所有的赋值操作都必须在函数体内?

70,040

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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