c语言中,声明和定义有什么区别

如题所述

如果是指变量的声明和定义:

从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。
对于下面的两句代码:
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() 让编译器知道这个函数的存在。

定义:一般在源文件里,具体就是函数的实现过程 写明函数体。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-09-12

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");
}

第2个回答  2017-08-28
/*这是声明,只是告诉编译器
"在某处有一个名称为a,接受一个int类型的形参,没有返回值(void)"
的函数,并没有给出具体实现(实现可能在其它文件中)*/
void a(int a);
.................
//这是函数定义,提供具体实现
void a(int a)
{
.........

}
另外形如
int a=10;
这种属于"声明的同时定义"
第3个回答  2017-08-09
自己理解:

声明:全局定义。
定义:可以全局,也可以局部。

其实用一个简单的例子就可以看出区别;可以用一个例子 测试一下输出,就可以完全理解。
第4个回答  2017-08-11
声明就是告诉你有这么个东西,具体在哪你不用管。
定义就是这个东西就是这。
声明可以有很多个,定义只能且必须有一个。
就好像你这个人就是一个定义,我告别人说有你这个人,就是声明。
相似回答