声明与定义

17 Mar 2025 | 4 分钟阅读

如果您是编程初学者,声明(Declaration)和定义(Definition)这两个术语可能会让人非常困惑。在某些方面,这两个概念有所不同,因为定义包含了对变量的内存分配,而声明则不分配内存。声明可以被多次声明。然而,一个实体在程序中只能被定义一次。

在本文中,您将学习声明和定义之间的区别。但在讨论区别之前,您必须先了解声明和定义及其示例。

什么是声明?

声明用于为程序命名,包括变量、命名空间、函数和类。在程序中使用名称之前,必须先声明它。与定义不同,程序项可以被多次声明。多个声明仅在不同的声明以相同格式进行时才可能。在编译器看来,声明是使程序元素可见的手段。

声明满足了定义的目标,但在以下情况除外,这些情况不会被推断:

  1. 当静态数据成员在类声明内部声明时,它不是声明。因为它只为类中的每个对象创建一个副本,而静态数据成员是给定类类型对象的元素。
  2. 当声明包含typedef语句时。
  3. 当一个变量在没有初始化器或函数体的情况下被声明,但它包含 extern 说明符。它为其他函数指定了定义,并赋予外部链接的标签。
  4. 当一个类的声明发生而没有包含其定义时(例如 class T)

通常,声明发生在作用域内,作用域决定了被声明名称的可见性以及已定义对象的生存期。

声明的示例

有各种各样的声明示例。以下是一些示例:

1. 变量声明

例如

int a;

在上面的例子中,包含变量名:a数据类型:int的信息被提供给编译器,并保存在一个称为符号表的_ 数据结构中。此外,将分配一个大小为2字节(取决于编译器类型)的内存块。

2. 函数声明

例如

int add(int a, int b);

这里,函数 add 使用两个int 类型参数和一个int 类型返回值进行声明。此时,不会分配内存。

什么是定义?

定义标识与函数、类、变量等相关的代码或数据。编译器需要定义来为已定义的_ 对象分配存储空间。当一个变量被定义时,它会占用多个字节的内存。函数定义会生成函数的代码。您在程序中只能定义一个程序元素,因为定义是程序元素的_ 特定规范。声明和定义之间的关系可能是一对多。

在某些情况下,程序元素可能未被定义但必须被声明,例如当一个函数从未被调用,或者尽管被声明但其地址从未被使用。另一个例子是,即使类定义必须被声明,但它并没有被使用。

定义的示例

1. 变量定义

例如

int a = 10;

这里,信息包含整数值10

2. 函数定义

例如

int add (int a, int b) { int z; z = a + b; return z; }

这里,在进行函数定义时会为 add 函数分配内存。虽然变量或函数可以被声明多次,但只能被定义一次。

声明与定义之间的主要区别

Declaration and Definition

声明和定义之间存在许多关键区别。声明和定义之间的一些关键区别如下:

  1. 与程序元素相关联的值由其定义确定。相比之下,声明则向编译器定义了程序元素的名称和类型。
  2. 程序元素可以被声明多次。相比之下,定义包含与程序元素名称相关的特定规范,任何代码或数据都可以识别。
  3. 在声明中,变量、函数、对象、类或枚举的作用域描述了它们的可见性。相比之下,定义中的作用域指的是时间。
  4. 程序的定义会分配一些内存。相比之下,声明不包含内存分配。
  5. 一旦一个实体被定义,定义过程就不能无限期地重复。相比之下,重声明随时都是可行的,即使您定义了一个实体。

声明与定义的逐项比较

在这里,您将学习声明和定义之间的逐项比较。声明和定义之间的主要区别如下:

特点声明定义
定义声明用于为程序命名,包括函数、变量、命名空间和类。定义标识与函数、类、变量等相关的代码或数据。
变量或函数变量或函数可以被声明多次。变量或函数只能被定义一次。
内存分配它不为实体分配内存。它为实体分配内存。
范围在声明中,变量、函数、对象、类或枚举的作用域描述了它们的可见性。定义中的作用域指的是时间。
重复一旦一个实体被定义,定义过程就不能无限期地重复。即使您定义了一个实体,重声明随时都是可行的。

结论

声明过程使程序元素对编译器可见,并且不需要内存分配。相比之下,定义是一个保留存储的声明。换句话说,编译器为已定义的项保留内存空间。


下一主题区别