声明(Declaration)与定义(Definition)的区别
在计算机科学领域,声明(Declaration)指的是向编译器说明一个变量或函数的信息,包括:名字、类型、初始值等,即声明变量、函数的属性细节;而定义(Definition)则指明变量、函数存储在哪里,当定义发生时,系统为变量或函数分配内存单元。
在 C 语言中,一般的声明语句同时包含了定义,二者同时发生,也就是说声明和定义没有区别。例如,考虑下面的声明(定义)语句
1
int a;
这里,这一语句声明了变量名 a
以及数据类型 int
两个信息,这些信息会告知给编译器,并将存储在符号表这一数据结构中。除此以外,2 字节(按编译器的类型而不同)的内存将被分配。
以下这些声明也包含了定义行为:
1
double val [MAXVAL];
如果,你仅仅需要声明而不想定义,即不想分配任何内存,则可用下面的语句:
1
extern int a;
这个例子中语句仅仅传递变量的信息而不会分配内存,它告诉编译器:现在变量 a
已经声明了,但是分配的内存在其他地方定义,可能在同一个编译文件也可能在不同的文件中。
下面仅仅是声明:
1
2
extern double val [];
typedef ...;
对于函数而言,声明向编译器提供了函数名、参数的数量及其类型、返回值的类型。例如下面的代码
1
int add(int, int);
这里,声明了有两个 int 型参数、名为 add
的函数,其返回值为 int 型。显然,按前面的解释,内存分配在此时还未发生。
函数的定义用于为函数分配内存。例如,考虑以下函数定义
1
2
3
4
int add(int a, int b)
{
return (a+b);
}
经过上述定义后,函数对应的内存将被分配。要注意,变量或函数可以被声明任意次,但只能被定义一次。
上述内容总结如下表
声明 | 定义 |
---|---|
变量或函数可以被声明任意次数 | 变量或函数只能定义一次 |
声明时内存不会被分配 | 内存会被分配 |
int f(int a); 这是一个函数声明。该声明仅用于告知编译器一个名为 f 、返回值和参数都是 int 的函数将被(后续的)函数使用 | int f(int a) { return a; } 系统按照此函数定义分配内存 |
This post is licensed under CC BY 4.0 by the author.