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语言中数组的定义和使用

数组的定义与使用 一、1.一维数组的定义: 类型说明符 数组名[常量表达式];    注意:常量表达式包括常量与符号常量,不能包含变量。 2.一维数组的引用: ...
  • u011032334
  • u011032334
  • 2014年12月09日 08:35
  • 21240

C语言之变量、常量(define\const)、变量的声明和定义

#include #include #include void main(){ int num = 10; int num1 = 20; int num2 = 30; //十进制,内存地址 ...
  • u013210620
  • u013210620
  • 2015年12月17日 00:24
  • 2228

C语言中声明和定义详解

变量声明和变量定义 变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。 变量声明:用于向程序表明变量的类型和名字。 定义也是声明,extern声明不是定义 ...
  • gatieme
  • gatieme
  • 2016年02月06日 16:56
  • 7296

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

转载自http://www.cnblogs.com/GavinDai/archive/2011/10/24/2222735.html 变量的声明有两种情况: 1、一种是需要建立存储空间的。例如...
  • qq_21411985
  • qq_21411985
  • 2015年03月05日 15:07
  • 3324

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

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

C语言中变量和函数的声明与定义

一、变量 在将变量前,先解释一下声明和定义这两个概念。声明一个变量意味着向编译器描述变量的类型,但并不为变量分配存储空间。定义一个变量意味着在声明变量的同时还要为变量分配存储空间。在定义一个变量的同...
  • root_robot
  • root_robot
  • 2016年11月17日 21:13
  • 669

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

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

学习笔记---C语言中全局变量,变量,常量的定义与使用

变量与常量的基础使用
  • aketoshknight
  • aketoshknight
  • 2016年11月23日 17:35
  • 920

【C语言】11-函数的声明和定义

一、函数的声明 1.在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用前面定义过的函数 1 int sum(int a, int b) { 2 re...
  • superchaoxian
  • superchaoxian
  • 2013年09月30日 23:33
  • 5228

C语言中变量的复杂声明和定义

我们知道:任何C语言变量的声明都由两部分组成:类型以及一组类似表达式的声明符。一旦我们知道如何声明一个给定类型的变量,那么该类型的类型转换符就很容易得到:只需要把声明中的变量名和末尾的分号去掉,再将剩...
  • GHX05130319
  • GHX05130319
  • 2015年05月08日 09:17
  • 1144
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言中的定义和声明的区别
举报原因:
原因补充:

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