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语言中的声明与定义的差别的更多相关文章

  1. PHP中变量声明和定义的区别

    先记录一下(不知道PHP是不是一样,但是C语言是这样的):把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”.声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用 ...

  2. C/C++中的声明与定义

    含义 声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间. 定义(Definition), 用于告诉编 ...

  3. C语言中的声明解析规则——数组,指针与函数

    摘要:C语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式 ...

  4. C++中的声明与定义

    转自:http://www.cnblogs.com/kingcat/archive/2011/12/30/2307426.html C++是一种复杂的计算机语言,很多在现代高级语言中已经不需要程序员操 ...

  5. C语言中函数声明实现的位置

    在学习C语言的时候我遇到了这么个事情,因为之前先学习的C#,在C#编译器中,函数的声明位置不会影响编译的结果,但是在C语言中却发生了错误 先看一段代码: #include <stdio.h> ...

  6. C语言的函数声明,定义,调用以及exit退出

    #include <stdio.h> #include <stdlib.h> void singing(); int main() { singing(); system(&q ...

  7. C语言中的数据转换和定义常量

    一.数据转换 1.数据类型转换:C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型:在 C 语言中也可以对数据类型进行强制转换: 2.自动转换规则: a)浮点数 ...

  8. python中的赋值操作与C语言中的赋值操作中的巨大差别

    首先让我们来看一个简单的C程序: a = ; b = a; b = ; printf("a = %d, b = %d\n", a, b); 相信只要学过C语言, 不用运行程序便能知 ...

  9. C语言中复杂声明的解读和简化

    code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...

随机推荐

  1. UOJ 274 【清华集训2016】温暖会指引我们前行 ——Link-Cut Tree

    魔法森林高清重置, 只需要维护关于t的最大生成树,然后链上边权求和即可. 直接上LCT 调了将近2h 吃枣药丸 #include <cstdio> #include <cstring ...

  2. 【leetcode dp】132. Palindrome Partitioning II

    https://leetcode.com/problems/palindrome-partitioning-ii/description/ [题意] 给定一个字符串,求最少切割多少下,使得切割后的每个 ...

  3. 【字符串】BNUOJ 52781 Book Borders

    https://www.bnuoj.com/v3/problem_show.php?pid=52781 [AC] #include<bits/stdc++.h> using namespa ...

  4. rest-assured 将log()中的信息打印到log日志中去的方法

    rest-assured 将log()中的信息打印到log日志中去的方法: ============方法1============== PrintStream fileOutPutStream = n ...

  5. 升级完Android Studio3.2后,打包release出现的错误

    升级完Android Studio2.3后,打包release出现的错误 Error:Execution failed for task ':qq:lintVitalRelease'.> Lin ...

  6. c/s委托练习

    今天玩了玩C/S开发,也随便练习了很久不用的委托 父窗体中写的代码 #region 委托与事件传递    public delegate void TextChangedHandler(string ...

  7. Codevs 2801 LOL盖伦的蹲草计划

    题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄.他的伟大之处在于他特别喜欢蹲草丛阴人(XL:蹲草阴人也算英雄?!CZQ:没办法,个个都是这么玩的).某日,德玛西亚与 ...

  8. 树状数组求第K大(From CLJ)

    ; <<log2[n];p;p>>=) if(a[ret+p]<=kth) kth-=a[ret+=p]; return ret;

  9. (3)Swing常用组件

    JTextField-文本框 继承自javax.swing.text.JTextComponent类

  10. codevs——2370 小机房的树

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 小机房有棵焕狗种的树,树上有N个 ...