第四章 连接
《C陷阱与缺陷》学习笔记
形参
实参
static
posts
4.1 什么是连接器
在C语言中,一个重要的思想就是分别编译,即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合到一起。但是连接器一般是与C编译器分离的,连接器如何做到把若干个C源程序合并成一个整体呢? 典型的连接器把由编译器或汇编器生成的若干个目标模块,整合成一个被称为载入模块或可执行文件的实体,该实体能够被操作系统直接执行。其中,某些目标模块是直接作为输入提供给连接器的;而另外一些目标模块则是根据连接过程的需要,从包括有类似printf函数的库文件中取得的。
简而言之,连接器就是用来连接各个编译好的模块,然后将其组成一个模块或者可执行文件。且会检查外部对象是否有重复,重复则报错。因为大多数连接器都进制同一个载入模块中的两个不同对象拥有相同的名称。
4.2 声明和定义
声明在函数体之外的变量是全局变量,也称为外部对象。
1.int a; //声明
2.a = 1; //定义
3.int b = 1; //声明并定义
如果使用了extern关键字,则代表该变量是其他地方分配的。
1.extern int a;
4.3 命名冲突与static修饰符
4.3.1 变量
static修饰的变量只会初始化一次
,其值固定在内存空间直至销毁,所以如果再次对其进行赋值是无效的。
static变量可以重名
,不会发生冲突
1.static int a;
2.int a;
4.3.2 函数
static声明的函数可以在外部使用,一般称其为静态函数
。
1.static int g(int x)
2.{
3.....
4.}
5.
6.void f()
7.{
8. b = g(a);
9.}
4.4 形参、实参与返回值
4.4.1 形参实参的区别
老生常谈了,用段代码来解释下形参
和实参
。
1.#include<stdio.h>
2.void swap(int a,int b)
3.{
4. int c = a;
5.#include<stdio.h>
6.void swap(int a,int b) //传的形参
7.{
8. int c = a;
9. a = b;
10. b = c;
11.}
12.void swap1(int *a,int *b) //传实参
13.{
14.
15. int c = *a;
16. *a = *b;
17. *b = c;
18.}
19.int main()
20.{
21. int a = 1,b = 2;
22. swap(a,b); //没有交换
23. printf("%d %d\n",a ,b);
24. swap1(&a,&b); //交换了
25. printf("%d %d\n",a , b);
26. return 0 ;
27.}
4.4.2 强制转换
当函数指定了参数类型,会进行强制转换
,比如:
1.double square(double);
2.square(2); //合法,会自动转换为双精度类型
4.4.3 返回值
函数除了构造函数
和析构函数
之外,都要声明返回值,void或者其他类型。
4.5 检查外部类型
在引用外部变量
的时候要注意最好是类型一样,比如:
1.char filename[] = "/etc/passwd";
2.
3.extern char* filename; //外部引用
虽然指针与数组好像是一样的,但是filename
的类型是“字符数组
”,而不是“字符指针”
。在第二个声明中,filename
被确定为一个指针
。这两个对filename
的声明使用存储空间的方式是不同的。
原内存布局
现内存布局
应该改为同样类型:
1.char filename[] = "/etc";
2.extern char filename[];
3.
4.char* filename= "/etc";
5.extern char* filename;
4.6 头文件
每个外部对象应只在一个头文件
中声明,需要用到该外部对象的所有模块
都应该包括这个头文件
。定义该外部对象的模块也应该包括这个头文件
。比如:
public.h
1.int a = 1;
2.char* str = "123";
main.c
1.#include <stdio.h>
2.#include "public.h"
3.extern int a;
4.extern char* str;
5.int main()
6.{
7. printf("%d\n",a);
8. return 0;
9.}
总结
C语言的连接是一个很强大的东西,将小的模块组成大的模块,文件和变量之间能很好的进行交互,从而达到高内聚低耦合的效果。
查看原文:http://47.100.160.51/wordpress/?p=115