在C语言中,变量的声明(declaration)和定义(definition)在某些上下文中是有所区别的,但在其他上下文中它们可能看起来是相同的。下面是它们之间的主要区别:
声明(Declaration)
- 声明告诉编译器变量的类型以及变量的名称。
- 它不分配内存空间给变量(除了在某些特殊情况下,如外部或静态变量的声明)。
- 声明可以多次出现在同一个程序中,但必须在变量被使用之前。
- 声明通常出现在函数外部(全局作用域)或函数内部(局部作用域)的顶部。
定义(Definition)
- 定义包含变量的声明,并为变量分配内存空间。
- 它确保变量有一个确定的值(除非它被显式地初始化为不确定的值,如未初始化的局部变量)。
- 一个变量只能在一个地方定义。
- 定义通常伴随着一个初始值(尽管这不是必须的,但对于局部变量来说,未初始化的局部变量会有不确定的值)。
示例
在全局作用域中:
c复制代码
// 这是一个声明,也是一个定义,因为它分配了内存空间并初始化了变量 | |
extern int globalVar = 10; | |
// 这是一个声明,但没有分配内存空间(但编译器知道在其他地方已经分配了) | |
extern int globalVar; | |
// 错误:不能再次定义同一个变量 | |
// int globalVar = 20; // 这会导致编译错误 |
在函数内部(局部作用域):
c复制代码
void function() { | |
// 这是一个定义,因为它在局部作用域中分配了内存空间 | |
int localVar = 20; | |
// 错误:不能在同一个作用域中再次定义同一个变量 | |
// int localVar = 30; // 这会导致编译错误 | |
// 可以在其他函数中声明与这个局部变量同名的变量,但它们是不同的变量 | |
} | |
void anotherFunction() { | |
// 这是一个新的声明和定义,与上面的localVar无关 | |
int localVar = 40; | |
} |
注意
- 在C语言中,对于外部或静态变量,
extern
关键字用于声明变量,而不是定义它。这告诉编译器变量在其他地方定义,但在这里只是被引用。 - 对于自动存储类(即函数内的局部变量),声明和定义通常看起来是相同的,因为它们在声明的同时就被定义了。
- 在C99及以后的版本中,可以在函数内部使用
extern
关键字来声明一个在其他地方定义的变量,但这在实践中并不常见。 - 头文件通常包含变量的声明,而不是定义,以避免在多个源文件中重复定义相同的变量。然而,对于
const
变量和inline
函数,情况可能会有所不同。