Post

声明(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;
}
系统按照此函数定义分配内存

参考翻译:Difference between Definition and Declaration

This post is licensed under CC BY 4.0 by the author.