C语言中的声明与定义的差别
1、对于以下的声明语句
int a;
假设其位置出如今全部的函数体之外,那么它就被称为外部对象a的定义。这个语句说明了a是一个外部整型变量,同一时候为a分配了存储空间。由于外部对象a并没有被明白指定不论什么初始值,所以它的初始值默觉得0(某些系统中的连接器对以其它语言编写的程序并不保证这一点,C编译器有责任以适当方式通知连接器,确保未指定初始值的外部变量初始化为0)。
2、又如以下的声明语句:
int a = 7;
在定义a的同一时候也为a明白指定了初始值。
这个语句不仅为a分配内存,并且也说明了在该内存中应该存储的值。
3、以下的声明语句:
extern int a;
它并非对a的定义。
这个语句仍然说明了a是一个外部整型变量,可是由于它包含了externkeyword,这就显式说明了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语言中的声明与定义的差别的更多相关文章
- PHP中变量声明和定义的区别
先记录一下(不知道PHP是不是一样,但是C语言是这样的):把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”.声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用 ...
- C/C++中的声明与定义
含义 声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间. 定义(Definition), 用于告诉编 ...
- C语言中的声明解析规则——数组,指针与函数
摘要:C语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式 ...
- C++中的声明与定义
转自:http://www.cnblogs.com/kingcat/archive/2011/12/30/2307426.html C++是一种复杂的计算机语言,很多在现代高级语言中已经不需要程序员操 ...
- C语言中函数声明实现的位置
在学习C语言的时候我遇到了这么个事情,因为之前先学习的C#,在C#编译器中,函数的声明位置不会影响编译的结果,但是在C语言中却发生了错误 先看一段代码: #include <stdio.h> ...
- C语言的函数声明,定义,调用以及exit退出
#include <stdio.h> #include <stdlib.h> void singing(); int main() { singing(); system(&q ...
- C语言中的数据转换和定义常量
一.数据转换 1.数据类型转换:C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型:在 C 语言中也可以对数据类型进行强制转换: 2.自动转换规则: a)浮点数 ...
- python中的赋值操作与C语言中的赋值操作中的巨大差别
首先让我们来看一个简单的C程序: a = ; b = a; b = ; printf("a = %d, b = %d\n", a, b); 相信只要学过C语言, 不用运行程序便能知 ...
- C语言中复杂声明的解读和简化
code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...
随机推荐
- BZOJ 3238 [Ahoi2013]差异 ——后缀自动机
后缀自动机的parent树就是反串的后缀树. 所以只需要反向构建出后缀树,就可以乱搞了. #include <cstdio> #include <cstring> #inclu ...
- 常州模拟赛d2t1 小X的质数
题目背景 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的 情感.小 X 认为,质数是一切自然数起源的地方. 题目描述 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因 ...
- hdu 2713
#include<stdio.h> #include<string.h> int map[151000][2]; int max(int a,int b) { return ...
- VirtualBox 下主机与虚拟机以及虚拟机之间互通信配置
引用链接:1)http://www.it165.net/os/html/201401/7063.html 2)http://www.cnblogs.com/sineatos/p/4489620.htm ...
- Garbage First介绍
本文摘自<构建高性能的大型分布式Java应用>一书,Garbage First简称G1,它的目标是要做到尽量减少GC所导致的应用暂停的时间,让应用达到准实时的效果,同时保持JVM堆空间的利 ...
- 等价表达式(codevs 1107 答案错误)
题目描述 Description 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 高通android7.0刷机工具使用介绍
刷机工具安装 1. 安装QPST.WIN.2.7 Installer-00448.3 2. 安装python2.7,并配置其环境变量 刷机方法 1.将编译后的刷机文件拷贝到如下目录:SC20_CE_p ...
- 创建微服务项目后,在谷歌、Safari等浏览器下无法访问的具体原因
使用SpringBoot开发了一个项目,端口随机给指定了一个,如6666. 可是奇葩的现象出现了,当在谷歌浏览器地址栏中输入localhost:6666访问的时候,提示无法访问. 检查良久,发现代码也 ...
- CSS 选择器语法参考手册
转自:http://www.w3school.com.cn/cssref/css_selectors.asp CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. &quo ...
- 接口自动化测试之HTTP协议详解
协议 简单理解,计算机与计算机之间的通讯语言就叫做协议,不同的计算机之间只有使用相同的协议才能通信.所以网络协议就是为计算机网络中进行数据交换而建立的规则,标准或约定的集合. OSI模型 1978年国 ...