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); ...
随机推荐
- UOJ 274 【清华集训2016】温暖会指引我们前行 ——Link-Cut Tree
魔法森林高清重置, 只需要维护关于t的最大生成树,然后链上边权求和即可. 直接上LCT 调了将近2h 吃枣药丸 #include <cstdio> #include <cstring ...
- 【leetcode dp】132. Palindrome Partitioning II
https://leetcode.com/problems/palindrome-partitioning-ii/description/ [题意] 给定一个字符串,求最少切割多少下,使得切割后的每个 ...
- 【字符串】BNUOJ 52781 Book Borders
https://www.bnuoj.com/v3/problem_show.php?pid=52781 [AC] #include<bits/stdc++.h> using namespa ...
- rest-assured 将log()中的信息打印到log日志中去的方法
rest-assured 将log()中的信息打印到log日志中去的方法: ============方法1============== PrintStream fileOutPutStream = n ...
- 升级完Android Studio3.2后,打包release出现的错误
升级完Android Studio2.3后,打包release出现的错误 Error:Execution failed for task ':qq:lintVitalRelease'.> Lin ...
- c/s委托练习
今天玩了玩C/S开发,也随便练习了很久不用的委托 父窗体中写的代码 #region 委托与事件传递 public delegate void TextChangedHandler(string ...
- Codevs 2801 LOL盖伦的蹲草计划
题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄.他的伟大之处在于他特别喜欢蹲草丛阴人(XL:蹲草阴人也算英雄?!CZQ:没办法,个个都是这么玩的).某日,德玛西亚与 ...
- 树状数组求第K大(From CLJ)
; <<log2[n];p;p>>=) if(a[ret+p]<=kth) kth-=a[ret+=p]; return ret;
- (3)Swing常用组件
JTextField-文本框 继承自javax.swing.text.JTextComponent类
- codevs——2370 小机房的树
2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 小机房有棵焕狗种的树,树上有N个 ...