c语言中,声明和定义有什么区别
17个回答
展开全部
如果是指变量的声明和定义:
从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。
对于下面的两句代码:
void Func()
{
int a;
int b=1;
a=0;
}
对于第一行代码,编译器不会做任何事,它不会为它在栈中分配一点东西,直到第三句,a=0;时,编译器才会将其压入栈中。而对于int b=0;这一句,编译器就会生成一条指令,为它赋值。如果反汇编,看到的代码可能是这样的:
push 1;
push 0;
当然,并不一定编译器就会样做,也有可能在声明int a时,编译器就会把一个废值入栈,到第三条再为其赋值,这要看编译器的具体取舍,所以,声明不一定不是定义,而定义一定是定义。
但是,下面的声明,一定仅仅是声明:
extern int a;
这表时,有一个int变量a,它一定是在另外其他地方定义的,所以编译器此时一定不会做什么分配内存的事,因为它就是声明,仅仅表明下面的代码引用了一个符号,而这个符号是int类型的a而已。
如果是指函数的声明和定义:
声明:一般在头文件里,对编译器说:这里我有一个函数叫function() 让编译器知道这个函数的存在。
定义:一般在源文件里,具体就是函数的实现过程 写明函数体。
从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。
对于下面的两句代码:
void Func()
{
int a;
int b=1;
a=0;
}
对于第一行代码,编译器不会做任何事,它不会为它在栈中分配一点东西,直到第三句,a=0;时,编译器才会将其压入栈中。而对于int b=0;这一句,编译器就会生成一条指令,为它赋值。如果反汇编,看到的代码可能是这样的:
push 1;
push 0;
当然,并不一定编译器就会样做,也有可能在声明int a时,编译器就会把一个废值入栈,到第三条再为其赋值,这要看编译器的具体取舍,所以,声明不一定不是定义,而定义一定是定义。
但是,下面的声明,一定仅仅是声明:
extern int a;
这表时,有一个int变量a,它一定是在另外其他地方定义的,所以编译器此时一定不会做什么分配内存的事,因为它就是声明,仅仅表明下面的代码引用了一个符号,而这个符号是int类型的a而已。
如果是指函数的声明和定义:
声明:一般在头文件里,对编译器说:这里我有一个函数叫function() 让编译器知道这个函数的存在。
定义:一般在源文件里,具体就是函数的实现过程 写明函数体。
展开全部
C语言里可能经常会说:
声明变量时不会分配内存,定义变量时才会分配内存。
局部变量的声明即是定义:
void fun(){
int a = 1; //既是声明,也是定义,初始值为1
int b; //既是声明,也是定义,初始值伪随机。
}
全局变量只能定义一次,可以声明多次,在全局变量不可见的地方但又想使用就得进行声明。
同一个文件中,比如main.c:
extern int a; //声明,不再分配内存,extern关键字表示此变量已在其它地方定义。
void fun(){
printf("%d\n",a); //此处用到了全局变量a,而a是在后面定义,所以需要在前面再声明一次。
}
int a = 1; //全局变量a定义,为它分配内存
int main()
{
fun();
return 0;
}
不同文件中:
fun.h:
void fun(); //函数声明
fun.c:
extern int a; //声明,不再分配内存,extern关键字表示此变量已在其它地方定义。
//函数定义
void fun(){
printf("%d\n",a); //此处用到了全局变量a,而a是在另外一个源文件中定义,所以需要在前面再声明一次。
}
main.c:
#include "fun.h"
int a = 1; //全局变量a定义,为它分配内存
int main()
{
fun();
return 0;
}
前面主要是针对变量的声明和定义的说明,当然也提到了函数的声明与定义。
函数和变量一样,使用前一定要先声明或者定义,定义本身也是一次声明。
//此处定义函数,有函数体,当然也是一次声明。
void fun(){
printf("hello world\n");
}
int main()
{
fun(); //fun函数在前面已经定义,所以可直接调用
return 0;
}
另一例子:
void fun();//此处须声明一次(没有函数体),main函数才能调用它。
int main()
{
fun(); //fun函数在后面定义。
return 0;
}
//此处定义函数,有函数体,当然也是一次声明。
void fun(){
printf("hello world\n");
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/*这是声明,只是告诉编译器
"在某处有一个名称为a,接受一个int类型的形参,没有返回值(void)"
的函数,并没有给出具体实现(实现可能在其它文件中)*/
void a(int a);
.................
//这是函数定义,提供具体实现
void a(int a)
{
.........
}
另外形如
int a=10;
这种属于"声明的同时定义"
"在某处有一个名称为a,接受一个int类型的形参,没有返回值(void)"
的函数,并没有给出具体实现(实现可能在其它文件中)*/
void a(int a);
.................
//这是函数定义,提供具体实现
void a(int a)
{
.........
}
另外形如
int a=10;
这种属于"声明的同时定义"
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
自己理解:
声明:全局定义。
定义:可以全局,也可以局部。
其实用一个简单的例子就可以看出区别;可以用一个例子 测试一下输出,就可以完全理解。
声明:全局定义。
定义:可以全局,也可以局部。
其实用一个简单的例子就可以看出区别;可以用一个例子 测试一下输出,就可以完全理解。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
声明就是告诉你有这么个东西,具体在哪你不用管。
定义就是这个东西就是这。
声明可以有很多个,定义只能且必须有一个。
就好像你这个人就是一个定义,我告别人说有你这个人,就是声明。
定义就是这个东西就是这。
声明可以有很多个,定义只能且必须有一个。
就好像你这个人就是一个定义,我告别人说有你这个人,就是声明。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询