复习
1. C语言产生个人库的功能提供了封装抽象数据类型的方法。
2. 将库定义分为头文件和实现文件为库函数做什么与它们如何做提供了自然区分的说明。
3. 定义宏是为常用的语句或操作提供一个名称。
4. exit函数允许提前终止程序执行。
5. 条件编译提供了为不同实现定制代码的方法,以及产生防止重复包含的库的头文件的方法。
6. 设计带参数argc和argv的函数main使命令行参数得以使用。
7. 库函数必须拥有有意义的名称和已明确定义的接口,并尽可能独立于全局定义的常量。
新的C语言结构
|
结 构 |
作 用 |
|
头文件(带有#if...#endif指令) /* somelib.h */ #if !defined (SOMELIB_H_INCL) #define SOMELIB_H_INCL #define SOMELIB_MAX 20 typedef struct { |
somelib.h是可以包含(#include "somelib.h")在任何希望使用其内容的程序中的头文件。somelib.h使用条件编译(#if...#endif)防止其内容重复包含 |
(续)
|
结 构 |
作 用 |
|
int comp; char s[SOMELIB_MAX]; } some_t; /* Purpose of function make_some */ extern some_t make_some(int n, const char str[]); /* other extern prototype */ #endif |
|
|
实现文件 /* somelib.c */ #include "somelib.h" #include <string.h> /* Purpose of function make_some */ some_t make_some(int n, const char str[]) { some_t result; result.comp=n; strcpy(results.s, str); return(result); } /* other function definitions */ |
somelib.c是与somelib.h相关的实现文件。它的目标文件必须链接到其他任何包含somelib.h的程序中 |
|
宏定义及调用 #define AVG(x,y) (((x)+(y))/2.0) … ans=AVG(2*a,b); |
预处理器会将每个AVG调用替换为它的宏扩展。给出的语句会变为 ans=(((2*a)+(b))/2.0); |
|
exit函数 /* Compute decimal equivalent of a * Common fraction */ double dec_equiv(int num, int denom) { if(denom==0) { printf("Zero-divide: %d/%d\n", num, denom); exit(1); } else { return((double)num/ (double)denom); } } |
如果以一个非法参数调用函数会提前终止程序 |
|
函数main的参数 int main(int argc, char *argv[]) { if(argc==3) process(argv[1], argv[2]); else printf ("Wrong number of options\n"); return(0); } |
函数main希望传递两个命令行参数到函数process |







