C语言中的声明与定义的区别

丁一鸣的CSDN 2014-09-13

1、对于下面的声明语句

int a;

如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义。这个语句说明了a是一个外部整型变量,同时为a分配了存储空间。因为外部对象a并没有被明确指定任何初始值,所以它的初始值默认为0(某些系统中的连接器对以其他语言编写的程序并不保证这一点,C编译器有责任以适当方式通知连接器,确保未指定初始值的外部变量初始化为0)。

2、又如下面的声明语句:

int a = 7;

在定义a的同时也为a明确指定了初始值。这个语句不仅为a分配内存,而且也说明了在该内存中应该存储的值。

3、下面的声明语句:

extern int a;

它并不是对a的定义。这个语句仍然说明了a是一个外部整型变量,但是因为它包括了extern关键字,这就显式说明了a的存储空间是在程序的其他地方分配的,从连接器的角度来看,上述声明是一个对外部变量a的引用,而不是对a的定义。因为这种形式的声明是对一个外部对象的显式引用,即使它出现在一个函数的内部,也仍然具有同样的含义。例如下面的函数srand在外部变量random_seed中保存了其整型参数n的一份拷贝:

void srand( int n )
{
    extern int random_seed;
    random_seed = n;
}

每个外部对象都必须在程序某个地方进行定义。因此,如果一个程序中包括了语句

extern int a;

那么,这个程序就必须在别的某个地方包括语句

int a;

这两个语句既可以是在同一个源文件中,也可以位于程序的不同源文件中。

4、如果一个程序对一个外部变量的定义不止一次,又将如何处理?即对于下面的情形:

int a;

这个语句出现在两个或更多的不同源文件中,情况会是怎样的?或者说,如果语句

int a = 7;

出现在一个源文件中,而语句

int a = 9;

出现在另一个源文件中,将出现什么样的情形?这个问题的答案一般跟系统有关。不同的系统可能有不同的处理方式。严格的规则是:每个外部变量只能够定义一次。如果外部变量的多个定义各指定一个初始值,例如:

int a = 7;

出现在一个源文件中,而

int a = 9;

出现在另一个源文件中,大多数系统都会拒绝接受该程序。但是,如果一个外部变量在多个源文件张定义却没有指定初始值,那么某些系统会接受这个程序,而另外一些系统则不会接受。但是为了避免这种问题的发生,最好的方法是每个外部变量只定义一次。

将C语言梳理一下,分布在以下10个章节中:

  1. Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成长之路(十):其他高级议题

相关推荐