C陷阱与缺陷(四)
第四章 连接
4.1 什么是连接器
C语言中的一个重要思想就是分别编译,即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合在一起。
典型的连接器把由编译器或汇编器生成的若干个目标模块,整合成一个被称为载入模块或可执行文件的实体,该实体能够被操作系统直接执行。
连接器通常把目标模块看成是由一组外部对象组成的。
连接器的输入一组目标模块和库文件,连接器的输出是一个载入模块。
4.2 声明与定义
下面的声明语句 int a;如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义。
这个语句说明了a是一个外部整型变量,同时为a分配了存储空间。如果它没初始化,则默认为0.
严格的规则是,每个外部变量只能够定义一次。
4.3 命名冲突与static修饰符
static是一个能够减少命名冲突的有用工具。
例如 static int a;
将a的作用域限制在一个源文件内,对于其它源文件,a是不可见的。
static修饰符不仅适用于变量,也适用于函数。
我们可以在多个源文件中定义同名的函数,只要都被定义为static,或者仅仅只有其中一个函数不是static.
4.4 形参、实参与返回值
如果一个函数在被定义或声明之前被调用,那么它的返回类型就默认为整型。
4.5 检查外部类型
假定我们有一个C程序,它由两个源文件组成。
一个文件中包含外部变量n的声明: extern int n;
另一个文件中包含外部变量n的定义: long n;
当这个程序运行时,可能发生以下情况:
一、C语言编译器能检测到冲突。
二、两者数值在内部表示上一样,例如都是32位,程序很可能正常工作。
三、共享存储空间,long的低端部分赋给了int类型的n,能正常工作。
四、共享存储空间,但是对其中一个赋值掩盖了另一个值,将不能正常工作。
注意 char filename[]=”hello"
与引用extern char* filename;
尽管在上下文环境中,数组与指针非常相似,但它们毕竟不同,需要进行修改。
4.6 头文件
每个外部对象只声明在头文件中,需要用刀该外部对象的所有模块都应该包括这个头文件。
定义该外部对象的模块也应该包括这个头文件。
假定一个程序在一个源文件中包含了声明: long fop;而在另一个源文件中包含了 extern short foo;
如果给long类型的foo赋了一个较小的值37,short类型的foo同时获得一个值37.那么我们知道运行改程序的硬件是一个低位优先的机器。
如果给long类型的foo赋了一个较小的值37,short类型的foo同时获得一个值0.那么我们知道运行改程序的硬件是一个高位优先的机器。
C陷阱与缺陷(四)的更多相关文章
- C陷阱和缺陷学习笔记
这段时间把<C陷阱和缺陷>看了,没时间自己写总结.就转一下别人的学习笔记吧http://bbs.chinaunix.net/thread-749888-1-1.html Chapter 1 ...
- 阅读《C陷阱与缺陷》的知识增量
版权声明:本文为Focustc原创文章.转载请注明作者及出处. https://blog.csdn.net/caozhankui/article/details/35925939 看完<C陷阱与 ...
- 读书笔记--C陷阱与缺陷(一)
要参与C语言项目,于是作者只好重拾C语言(之前都是C++,还是C++方便). 看到大家都推荐看看 C陷阱与缺陷(C traps and pitfalls),于是好奇的开始了这本书的读书之旅. 决定将 ...
- 读书笔记--C陷阱与缺陷(七)
第七章 1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的. 误用null指针的后果是未定义的,根据编译器各异. 有的编译器对内存位置0只读,有的可读写. 书中给出了一 ...
- [C陷阱和缺陷] 第1章 词法“陷阱”
有感自己的C语言在有些地方存在误区,所以重新仔细把"C陷阱和缺陷"翻出来看看,并写下这篇博客,用于读书总结以及日后方便自身复习. 第1章 词法"陷阱" 1.1 ...
- C语言学习书籍推荐《C陷阱与缺陷》下载
下载地址:点我 凯尼格 (作者), 高巍 (译者) <C和C++经典著作:C陷阱与缺陷>适合有一定经验的C程序员阅读学习,即便你是C编程高手,<C和C++经典著作:C陷阱与缺陷> ...
- 读书笔记--C陷阱与缺陷(四)
第四章 1. 连接器 C语言的一个重要思想就是分别编译:若干个源程序可在不同的时候单独进行编译,恰当的时候整合到一起. 连接器一般与C编译器分离,其输入是一组目标模块(编译后的模块)和库文件,输出是一 ...
- c缺陷与陷阱笔记-第四章 连接
1.变量的声明. 在不同的源文件中,应该是1个定义+多个声明的形式存在的,并且声明的类型和定义的类型要一样,否则可能会报错. 声明 : extern 类型 变量名 声明并定义: extern 类型 变 ...
- 《C陷阱与缺陷》读书笔记
1. 词法“陷阱” = 不同于 == , 可以通过if( 1 == a )来避免 & | 不同于 && || 词法分析中的“贪心法” 编译器将程序分解成符号的方法是,从左到右一 ...
随机推荐
- BNUOJ29065鸣人的查克拉
鸣人的查克拉 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: ...
- Docker之dockerfile
一.什么是dockerfile Docker通过对于在dockerfile中的一系列指令的顺序解析实现自动的Image的构建: 通过使用build命令,根据dockerfile的描述来构建镜像: bu ...
- winform treeview 通过节点名称添加子节点
/// <summary> /// 添加人员节点(利用TreeNodeCollection) /// </summary> /// <param name="t ...
- linux定时任务crontab的设置
linux定时任务crontab的设置http://www.blogjava.net/freeman1984/archive/2010/09/23/332715.html vi /etc/cronta ...
- c#操作MySQL数据库中文出现乱码(很多问号)的解决方法
前题:修改discuz论坛帖子老连接(从NT版转到PHP版的discuzX3),帖子里有很多引用,有链接都是.aspx这样的链接. 需要将这些链接改到当前论坛的链接. 思路:用asp.net程序获取含 ...
- 创建txt格式文本日志
公共方法(可以将其放到类库里边): #region 记录日志 #region 写日志 /// <summary> /// 写日志 /// </summary> /// < ...
- Nmon的安装及使用
1.安装软件 1) 用root用户登录系统,建立目录:#mkdir /nmon 2) 通过FTP将下载的nmon工具上传至服务器 192.168.40.212目录/nmon下. 3) 修改tar包权 ...
- 【转】C#实现MD5加密
转自:C#实现MD5加密 常用的如下: 方法一 首先,先简单介绍一下MD5 MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laborator ...
- C#_socket拆包_封包_模拟乱序包
拆包一直是个硬伤呀,MLGB的,服务端各种乱数据,果断整理下 拆包思路:设计一个网络协议,一般都会分包,一个包就相当于一个逻辑上的命令. .如果我们用udp协议,省事的多,一次会收到一个完整的包,但U ...
- 利用python进行数据分析之绘图和可视化
matplotlib API入门 使用matplotlib的办法最常用的方式是pylab的ipython,pylab模式还会向ipython引入一大堆模块和函数提供一种更接近与matlab的界面,ma ...