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

转载 2016年05月31日 22:53:24

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

声明用于向程序表明变量的类型和名字定义包括声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型前的关键字extern。

extern int i; // declares but does not define i

int i; // delares and defines i

例子:

1 #include <stdio.h>
2
3 intmain()
4 {
5 extern int i;
6 i = 5;
7 return 0;
8}
VS2010:  error LNK2001: 无法解析的外部符号 "int i" (?i@@3HA)

           fatal error LNK1120: 个无法解析的外部命令

分析:extern int i只是说明变量定义在程序的其他地方(也就是程序的外部,一般是在程序的其他文件中),但是程序找不到该变量,正确使用如下:为项目再添加一个.c的源文件,在该源文件中添加定义int i,这样就可以正确使用。

extern声明不是定义,也不分配存储空间。事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次

只有当声明也是定义时,声明才可以有初始化式,因为只有定义才分配存储空间。初始化式必须要有存储空间来进行初始化。如果声明有初始化式,那么它可以当作定义,即使声明标记为extern:

extern double pi 3.1416; //definition

1 #include <stdio.h>
2
3 extern int i = 5;
4 int main()
5 {
6
7 printf("i %d\n"i);
8 return 0;
9 }

编译通过。虽然使用了extern, 但是这条语句还是定义了pi,分配并初始化了存储空间。只有当extern声明位于函数外部时,才可以含有初始化式

例子:

1 #include <stdio.h>
2
3 intmain()
4 {
5 externinti=5// 在函数内部使用externt 并初始化。编译时出错:error C2205: “i”: 不能对带有块范围的外部变量进行初始化
6 printf("i = %d\n", i);
7 return0;
8 }

编译时出错:error C2205: i不能对带有块范围的外部变量进行初始化

 

因为已初始化的extern声明被当作是定义,所以该变量任何随后的定义都是错误的:

extern double ip 3.1416; //definition

double pi 3.1416; //error: redefinition of pi

例如:

1 #include <stdio.h>
2
3 externdoublepi=3.1416; //definition
4 doublepi=3.1416; // error C2374: pi: 重定义;多次初始化
5 intmain()
6 {
7 printf("pi = %f\n", pi);
8 return0;
9 }

编译出错:error C2374: “pi”: 重定义;多次初始化,

但是要注意区别:

1 #include <stdio.h>
2
3 extern double pi = 3.1416//definition
4 int main()
5 {
6 double pi = 3.1415// definition, and no error,output pi = 3.141500, not pi = 3.141600
7 printf("pi = %f\n", pi);
8 return 0;
9 }

分析:这涉及到作用域问题,double pi 3.1415具有main(){}内部作用域,

而extern double pi 3.1416具有全局变量作用域,在执行main(){}过程中,man(){}内部的那个pi(pi 3.1415)覆盖了全局变量pi(pi 3.1416)。因此没有变量pi的重定义的错误,输出结果为pi 3.1415;

同样,随后的含有初始化式的extern声明也是错误的:

extern double pi 3.1416; // definition

extern double pi; // OK: declaration not definition

extern double pi 3.1416; // error: redefinition of pi

extern应用场合:任何在多个文件中使用的变量都需要有与定义分离的声明。这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义),因为变量须且仅能定义一次,而变量的声明可以多次。

-----摘自《c++ primer 4th》

举报

相关文章推荐

C语言定义和声明的区别

定义和声明的根本区别: 定义创建了对象并为之分配了内存,声明没有分配内存! C语言中有32个关键字:如下表 1.auto:编译器在默认的缺省情况下,所有变量都是aut...

C语言中声明、定义和初始化的区别

此外,其声明用于说明变量的属性(主要是变量的类型),且可多次声明;而变量的定义除此以外还将引起存储器的分配,且只能定义一次。 注意:定义是一种特殊的声明。 int sp; double val[MAX...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

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

C语言中变量定义与声明的区别(转载) (2012-04-16 21:13) 标签:  定义 声明  存储  definition  defining  C语言  分类:...

在C语言中什么是定义?什么是声明?它们有何区别?

在C语言中什么是定义?什么是声明?它们有何区别?

C语言中声明和定义的区别——分析extern关键词。

一直很迷惑C语言中的声明和定义的有些实践中的用法,说迷惑实践是因为声明和定义的概念上的区别是很明确的。 定义和声明的区别(主要针对变量): 定义是要为变量分配存储空间,还可以在定义的时候为变量指定...

C语言 变量声明和定义的区别

变量的声明有两种情况: 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。 2、另一种是不需要建立存储空间的。 例如:extern int a 其中变量a是...

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

在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:    变量的声明有两种情况:    ...

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

1、对于下面的声明语句 int a;       如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义。这个语句说明了a是一个外部整型变量,同时为a分配了存储空间。因为外部对象a并没有被...

C语言多文件编译时,编译器不检测其声明的变量类型与定义时的类型是否匹配

比如我在文件1里定义int c = 0x31323334; 在文件2里声明extern char c;   编译器并不会报错的。 //File: 1.c char a[100] ...
  • e3399
  • e3399
  • 2012-04-21 16:42
  • 1054

C语言中的复杂声明和定义,以及如何使用typedef进行简化

在阅读Linux的内核代码是经常会遇到一些复杂的声明和定义,诸如:         (1)  void * (* (*fp1) (int)) [10];      ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)