• 全部
...

变量的声明和定义的区别到底是什么

bjvictoria 2009-06-23 08:44:18
RT,请尽可能详细!
...全文
给本帖投票
1436 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcchen_bo_qiang 2009-06-23
  • 打赏
  • 举报
回复
#include "iostream.h"
void fun(float x,float y); //函数的声明
void fun(float x,float y) //函数定义
{
int sum;
sum=x+y;
cout<<sum<<endl;
}
void main()
{
int a,b;
cout<<"please input two numbers:\n";
cin>>a>>b;
fun(a,b); //函数传值调用
}

函数声明是一条完整的语句,因此用分号结束语句。而函数定义没有,声明什么函数,就可以在函数定义的函数体实现什么样的功能。这个程序是传值函数的调用。呵呵!!我是新手!如果有什么不足的地方,请各位大虾指点一下!
Meteor_Code 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pathuang68 的回复:]
1. 为什么要区分变量的声明和定义?主要是为了让多个文件可以访问同一个变量;
2. 一个变量的定义会为变量分配存储空间,也有可能同时为其提供初始值;
3. 声明则仅给出变量的数据类型和变量名称;
4. 变量的定义肯定也是变量的声明,反之则未必;
5. 在作用域内,变量的定义有且仅有一个,声明则可以有多个;
6. 有extern的时候,两者的情况区分:
extern int i; // 声明而不是定义,因为不分配存储空间。
extern int i = 1; //定义,因为分配了存储空间
[/Quote]
最后一句,是有问题的,C/C++规则,一个全局变量,不是static,register就是extern,(不要和我说auto这个类型,在TC时代就是空壳类型了,它会成为extern),register也不是所有的编译器支持,没有必要写extern,在VC6中
extern int i; // 声明而不是定义,因为不分配存储空间。
extern int i = 1; //定义,因为分配了存储空间
这样写就是错的,因为编译器无法区分那里是定义,那里是声明,因为全局变量是可以没有初值的.
其实"变量的声明和定义"是指全局变量的声明和定义,因为局部变量没有声明的意义.
之所以要声明主要的原因是一个编译问题,当你在一个A.CPP文件(或者A.C)中定义一个全局变量global,.当A.CPP变成A.OBJ的时候这个global的相关信息就会保存在A.OBJ里面.而一个软件工程不可能只有一个A.CPP,还会有B.CPP,那么B中的程序也需要使用这个global,B.CPP就需要一种办法知道这个符号global是什么类型,于是你需要声明在工程里的另一个文件里有这个符号global,这个时候用到了关键字extern.当B.CPP变成B.OBJ的时候global只会在B.OBJ保存一个引用副本信息.
当A.OBJ和B.OBJ一起被连接成为一个.EXE(或者其他最终文件)的时候,连接器会根据B.OBJ中引用副本信息在A.OBJ中找到global的具体信息以及虚地址信息.
你可以做一个简单的实验,在B.CPP里面写一个global但不是声明而是一个定义,不加extern.这时候你的编译没有问题,但A.OBJ和B.OBJ一起被连接时就会报错,重定义,这时候你可以把其中一个global的定义前加static,这时候static的global会被连接器做特殊处理,只有定义这个global的.OBJ才可以引用它,其他OBJ根本看不到他.
LZ如果接触很多大规模工程(20个以上.CPP.C.CXX.RC之类的文件.H文件不算)就不会对这个问题感到陌生了,希望对你有用!
有用就给分哦~~~~
机智的呆呆 2009-06-23
  • 打赏
  • 举报
回复
lz还是还是看下ISO/IEC14882 c++标准吧,那里有最权威最详尽的解释
Jalien 2009-06-23
  • 打赏
  • 举报
回复
变量声明时并不分配内存,变量定义时才分配内存。如果是const的话不一定马上分配内存,取地址等时才分配内存。
另外一个变量可以多次声明却只能有一个定义。
ameyume 2009-06-23
  • 打赏
  • 举报
回复
感觉与函数,类的声明与定义类似
例如,函数声明:
void swap(int a, int b);

而函数定义是以下方式:
void swap(int a, int b)
{
...
}
飞天御剑流 2009-06-23
  • 打赏
  • 举报
回复
主要区别在于是否分配内存空间上。

声明不一定分配空间,定义必定分配空间,例如:

extern int a; //仅仅是声明,并不分配空间

int a; //既是声明也是定义,分配空间。
「已注销」 2009-06-23
  • 打赏
  • 举报
回复
变量的声明主要是为了访问全局变量。
机智的呆呆 2009-06-23
  • 打赏
  • 举报
回复
3.1 Declarations and definitions [basic.def]
1 A declaration (clause 7) introduces names into a translation unit or redeclares names introduced by previous
declarations. A declaration specifies the interpretation and attributes of these names.

2 A declaration is a definition unless it declares a function without specifying the function’s body (8.4), it
contains the extern specifier (7.1.1) or a linkage-specification24) (7.5) and neither an initializer nor a
function-body, it declares a static data member in a class declaration (9.4), it is a class name declaration
(9.1), or it is a typedef declaration (7.1.3), a using-declaration (7.3.3), or a using-directive (7.3.4).
Walf_ghoul 2009-06-23
  • 打赏
  • 举报
回复
变量的声明是不分配存储空间的,但是指出了声明变量是存在的,并且说明了变量的名称和变量的位置。但是变量的定义就不一样了,不仅要说明变量的名称和位置,还要分配相应的存储空间。声明的变量势必要在某处进行定义。
denelf 2009-06-23
  • 打赏
  • 举报
回复
变量的定义与声明
变量的声明有两种情况:
一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。

另一种是不需要建立存储空间的 例如:extern int a 其中 变量a是在别的文件中定义的。

其中,第一种是"定义性声明(defining declaration)"或者称为"定义(definition)",而后者则是"引用性声明(referncing declaration)" 。从广义的角度来讲,声明中包含着定义,但是并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。然而对于 extern int a 来讲,它只是声明不是定义。一般的情况下我们常常这样叙述:把建立空间的声明称之为"定义",而把不需要建立存储空间称之为"声明"。很明显我们在这里指的声明是范围比较窄的,也就是说非定义性质的声明 例如:在主函数中


#include <iostream>
using namespace std;

int main()
{
extern int A; //这是个声明而不是定义,声明A是一个已经定义了的外部变量
//注意:声明外部变量时可以把变量类型去掉如:extern A;

return 0;
}
int A; //是定义,定义了A为整型的外部变量



外部变量的"定义"与外部变量的"声明"是不相同的。外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明),也可以在函数之外(在外部变量的定义点之前)。系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。对于外部变量来讲,初始化只能是在"定义"中进行,而不是在"声明"中 。所谓的"声明",其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是在为了"提前"引用该变量而作的"声明"而已。extern 只作声明,不作任何定义 。
ameyume 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pathuang68 的回复:]
1. 为什么要区分变量的声明和定义?主要是为了让多个文件可以访问同一个变量;
2. 一个变量的定义会为变量分配存储空间,也有可能同时为其提供初始值;
3. 声明则仅给出变量的数据类型和变量名称;
4. 变量的定义肯定也是变量的声明,反之则未必;
5. 在作用域内,变量的定义有且仅有一个,声明则可以有多个;
6. 有extern的时候,两者的情况区分:
extern int i; // 声明而不是定义,因为不分配存储空间。

[/Quote]
顶,很详细
pathuang68 2009-06-23
  • 打赏
  • 举报
回复
1. 为什么要区分变量的声明和定义?主要是为了让多个文件可以访问同一个变量;
2. 一个变量的定义会为变量分配存储空间,也有可能同时为其提供初始值;
3. 声明则仅给出变量的数据类型和变量名称;
4. 变量的定义肯定也是变量的声明,反之则未必;
5. 在作用域内,变量的定义有且仅有一个,声明则可以有多个;
6. 有extern的时候,两者的情况区分:
extern int i; // 声明而不是定义,因为不分配存储空间。
extern int i = 1; //定义,因为分配了存储空间
机智的呆呆 2009-06-23
  • 打赏
  • 举报
回复
没想到板凳也占了,
机智的呆呆 2009-06-23
  • 打赏
  • 举报
回复
哈哈,抢个sf真不容易啊
机智的呆呆 2009-06-23
  • 打赏
  • 举报
回复
可以认为变量声明时不分配存储空间,而定义时分配空间。

65,183

社区成员

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

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

手机看
关注公众号

关注公众号

客服 返回
顶部