天天看点

C语言中声明和定义详解 变量声明和变量定义 如何清晰的区分变量声明和定义 程序模块化设计风格 示例程序

变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。

变量声明:用于向程序表明变量的类型和名字。

定义也是声明,extern声明不是定义

定义也是声明:当定义变量时我们声明了它的类型和名字。 extern声明不是定义:通过使用extern关键字声明变量名而不定义它。 [注意] 变量在使用前就要被定义或者声明。 在一个程序中,变量只能定义一次,却可以声明多次。 定义分配存储空间,而声明不会。

1.extern告诉编译器变量在其他地方定义了。

例如:

1

2

2.如果声明有初始化式,就被当作定义,即使前面加了extern。

只有当extern声明位于函数外部时,才可以被初始化。

3.函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明。

4.除非有extern关键字,否则都是变量的定义。

一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量,c++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次。

不过有三个例外,一下三中实体的定义也可放到头文件中。

这三个实体可以定义在多个源文件中,只要在每个源文件中的定义相同。

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

C语言中声明和定义详解 变量声明和变量定义 如何清晰的区分变量声明和定义 程序模块化设计风格 示例程序

在这个程序中,我们再函数外部定义了一个变量

注extern int a = 10;只有当extern声明位于函数外部时,才可以被初始化。

我们后面还会提到这个问题

在这个程序中,

int a;是个定义,但是未初始化,打印他的值式不确定的,因此编译时会报未初始化的异常。

int b = 10; 是个定义,并且被正确初始化,打印b的值没有问题。

C语言中声明和定义详解 变量声明和变量定义 如何清晰的区分变量声明和定义 程序模块化设计风格 示例程序

但是是个声明,如果要对c进行读写操作,而我们并没有对c进行定义,因此语法检查没有问题,但是在链接时,连接器会找不到c的地址。

C语言中声明和定义详解 变量声明和变量定义 如何清晰的区分变量声明和定义 程序模块化设计风格 示例程序

对于d再明显不过了,前面我们提到过如果声明有初始化式,就被当作定义,即使前面加了extern。但是只有当extern声明位于函数外部时,才可以被初始化。

现在这个定义很明显被gcc编译器认为是错误的。

C语言中声明和定义详解 变量声明和变量定义 如何清晰的区分变量声明和定义 程序模块化设计风格 示例程序

转自:http://blog.csdn.net/gatieme/article/details/50640424

继续阅读