extern int i=0到底是声明还是定义呢?

R9R9R9 2005-05-31 10:33:20
我是论坛上搜索过,其中一贴子是这样写的:
--------------------------------
那么extern int a=0;是声明还是定义?

还是声明
引用别的地方的变量,把这个变量的值付为0。
--------------------------------

但是今天我在书中这样写道:"既指定的了关键字extern又指定了一个显示的初始值的全局对象的声明

将被视为该对象的定义!"

那按这样说来extern int a=0应该算是对a的定义了?是这样子的吗?

还有extern只能放在全局域中声明的吗?我放在局部域中声明出现了错误..

...全文
736 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoluoli 2005-06-01
  • 打赏
  • 举报
回复
当其他地方定义了变量a后,这种语法就是声明赋值,
当前面(其他程序)没有定义a,那么就是定义。
lzhongsh 2005-06-01
  • 打赏
  • 举报
回复
GZ
sunlu_eric 2005-06-01
  • 打赏
  • 举报
回复
是声明,表示,该变量在别的文件中已经定义,可以使用!
lwg0869 2005-06-01
  • 打赏
  • 举报
回复
vc中全局变量先于主函数构造,并且放在全局数据区。由编译器在编译期间完成地址的分配
------------------------------------------------------------------------------------
这里的分配是逻辑地址空间上的,并且真正的分配,所以在它上面的操作就是错误的
lwg0869 2005-06-01
  • 打赏
  • 举报
回复

其实变量的完整定义应为
作用域 变量类型 变量名
vc中全局变量先于主函数构造,并且放在全局数据区。由编译器在编译期间完成地址的分配,但不能进行操作如:
extern int i=10;
i=20;//错误
在32位环境中,程序空间为4g,代码和数据共用一个地址空间,这样理解可能就不完全了。(越学越糊糊)

希望大家指正!
lwg0869 2005-06-01
  • 打赏
  • 举报
回复
extern关键字,用来连接一个外部引入的符号,如果符号不存在,就创建一个.他和语言的语法无关,和编译器生成的obj文件有关.c和c++符号生成的规则不一样,其命名也不同,因此会出现以上的结果
------------------------------------------------------------------------------------------
语法中规定变量作用域,只是编译器的实现不同!
qiuwenqiao 2005-06-01
  • 打赏
  • 举报
回复
int a=0
同时声明和定义了
Extern 让其他单元也能使用这个变量
Petizol 2005-06-01
  • 打赏
  • 举报
回复
同意楼上的观点
megaboy 2005-06-01
  • 打赏
  • 举报
回复
to eric8231

你试试在外部不定义int a的时候,在函数内部直接extern int a=0,然后在函数中使用a变量,你就

知道这时候根本没有创建int a,因为extern在这里仅仅是声明,不是定义。
R9R9R9 2005-06-01
  • 打赏
  • 举报
回复
哦,,我明白了,,谢谢大家的回复

刚刚想歪了~~
R9R9R9 2005-06-01
  • 打赏
  • 举报
回复
只有一个文件,,fun()在全局定义的

j=10这里定义的吧,有没有错?

运行出错,编译通过

错误信息:

1.obj : error LNK2001: unresolved external symbol "int j" (?j@@3HA)
Debug/1.exe : fatal error LNK1120: 1 unresolved externals
MuseIn 2005-06-01
  • 打赏
  • 举报
回复
fun()必须知道j在哪里定义的
whatsouta 2005-06-01
  • 打赏
  • 举报
回复
你的 J 在哪里定义的?
什么错误信息?
R9R9R9 2005-06-01
  • 打赏
  • 举报
回复
谢谢大家的解答,,还有一点小问题//

TO megaboy(没油的猪)

那么在函数部声明一个extern的变量应该怎么使用呢?

如:
void fun()
{
extern int j;//这里为声明
j=10; //那么这里写定义应该没有错吧,为什么程序不能通过编译呢?
cout<<"j= "<<j<<endl;
}
void main()
{
fun();
}
eric8231 2005-06-01
  • 打赏
  • 举报
回复
不论出现在哪里, “extern int a=0;” 将被视为 “int a=0;”

也就是说,当编译期发现extern声明的后有一个初始式时,将简单地忽略掉“extern”。
megaboy 2005-05-31
  • 打赏
  • 举报
回复
to doon(东方):

extern关键字,用来连接一个外部引入的符号,如果符号不存在,就创建一个.
------------------------------------------------------------------

这句话要稍微修改一下,当extern用在外部时,这样说是正确的。但在代码块内extern就只能是

声明,即使在代码块内你写成extern int i=10;,也无效的,不会创建i变量。
megaboy 2005-05-31
  • 打赏
  • 举报
回复
那本书写的是正确的,那个贴子是错的。

因为只有定义才能初始化,声明是不能初始化的,除非定义与声明合二为一的,比如auto、register等。

extern int a可以是一个声明或定义,但extern int a=0一定是一个定义。

extern也可以用在代码块内,但相应的外部变量必须有一个定义,否则那个变量是使用不了的(虽然

可以通过编译)。定义只能有一个,但extern可以声明多次!
漂流的代码 2005-05-31
  • 打赏
  • 举报
回复
extern即可以作为声明也可以作为定义.
当在同一工程中有相同定义时,extern int i=0就是非法;如果没有这个定义,就是合法的,同int i=0有相同的效果,如果定义类型不同,则也可以通过.测试如下:

在工程a中,有文件a.cpp内容如下:
extern int i=10;
void main()
{
printf("i in main:%d",i);
}
结果是:
i in main:10
加入文件b.cpp,内容如下
int i=20;
void func1()
{
printf("i in func1:%d",i);
}
将a.cpp改为:
extern int i=10;
void func1();
void main()
{
printf("i in main:%d",i);
func1();
}
连接出错,变量名已经定义
如果把b.cpp改成
int i=20 => char i=20
则能通过,且输出
i in main:10i in func1:20

如果将b.cpp加上extern "c",如
extern"C"{
int i=20;
void func1()
{
printf("i in func1:%d",i);
}
}
则结果同上.
如果再将a.cpp中做如下修改
extern "C" int i = 10;
即使将b.cpp中的 int i = 20改成char i=20也不能成功连接
当然,如果把b.cpp中的extern "C"去掉,有可以正常执行.

我用的vc6+xp系统测试的.
结果表明:
extern关键字,用来连接一个外部引入的符号,如果符号不存在,就创建一个.他和语言的语法无关,和编译器生成的obj文件有关.c和c++符号生成的规则不一样,其命名也不同,因此会出现以上的结果

64,648

社区成员

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

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