c语言预处理器
来源:互联网 发布:苏州网络约车最新办法 编辑:程序博客网 时间:2024/05/22 04:51
本文参考自《C语言程序设计--现代方法》
预处理器是什么?
预处理器是一个小软件,它可以在编译前处理c程序,和其他语言不同,c和c++语言十分依赖预处理器,现在一般和编译器集成在一起。
预处理器的优缺点
预处理器是一种强大的程序处理工具,但预处理经常导致一些难以发现的错误,我们在gcc中可以用-E选项在编译时产生预处理器的输出(其他编译器也可以,方法不同)。
预处理的指令
预处理一般分为宏定义,文件包含,条件编译这三个常用的指令。
#define
宏定义一般用来定义常量,比如:
对类型的重命名 #define BOOL int
定义字符串值 #define CR "\r"
改变c的语法结构,比如 #define BRGIN {
#define END }
带参数的宏 #define MAX(a, b) ((x)>(y)?(x):(y))
#预算符可以为替换的字符加标签,比如
#define PRINT_INT(n) printf(#n "= %d\n", n)
会被替换为
printf("i/j" "=%d\n", i/j);
c语言相邻的字符串面量会被合并,于是就变成了
printf("i/j = %d\n", i/j);
##可以将两个标识符组合到一起,比如
#define MK_ID(n) i##nint MK_ID(1), MK_ID(2),MK_ID(3);/*预处理后变为 int i1, i2, i3;*/
用法举例:如果我们想定义一个比较大小的宏,但是int和float类型的都要能比较,我们又不能定义两个一样的宏名,可以用type连上函数名区别,
#define GENERIC_MAX(type) type type##_max(type x, type y) \ { \ return x>y > x : y; \ }
宏的作用范围通常在包含宏的文件末尾。
宏可以用#undef指令取消定义。
定义较长的宏
#define ECHO(s) (gets(s), put(s)) ECHO(str); /*替换为gets(str), puts(str)*/
c语言自定义的宏
c语言自定义了一些宏,比如__FILE__是被编译的文件名,__DATE__是被编译的日期,c99新增了几个宏,其中包括:__STDC_VERSION__支持的c版本等。
#include
文件包含指令,常用来包含头文件。
可以结合下面的条件编译来防止头文件被包含两次:
#ifndef BOOLEAN.H#define BOOLEAN.H头文件的内容#endif
条件编译
#if、#ifdef、#ifndef、#elif、#else、endif
如果常量表达式的值为0,则#if和#endif中间的代码会在预处理时被删除,否则会保留。
#if 常量表达式1 当表达式非0时需要包含的代码 #elif 表达式2 当表达式1为0但表达式2非0时需要包含的代码#else其他条件下需要包含的代码#endif
使用条件编译可以编写在多平台上可移植的程序,可以编写不同编译器上编译的程序,可以临时屏蔽包含注释的代码
/*条件编译*/#ifdef 标识符 当标识符被定义为宏时需要包含的代码#endif
/*屏蔽包含注释的代码*/#if 0包含注释的代码行#endif
/*编写不同编译器上编译的程序*/#if __STDC__ 函数原型#else 老式的函数声明#endif</span>
预处理指令都以#开始,同一条指令换行要加\,比如
#define DISK_CA (SIDES * \ RADAS *)
指令可以放在程序的任何地方,注释与指令习惯性的放一行。
其他指令
#error 通常与条件编译指令一起用于检测正常编译过程中不应出现的情况,比如,我们确保一个程序无法再一台int类型不能存储超过100000的机器上编译,最大允许的int值用INT_MAX宏表示,
#if INT_MAX <100000 #error int type is too smallendif
如果试图在16位的机器上编译这个程序,将会产生错误:Error directive:int type is too small
#line可以改变__LINE__宏的值,即改变行号。
#pragma指令可以包含libs库等,具体作用比较复杂,比如:
#pragma comment(lib, "ws2_32.lib")//装载winsock2的静态链接库
0 0
- C语言预处理器
- C语言-预处理器
- 【C语言】预处理器
- c语言预处理器
- C语言预处理器
- C语言预处理器
- C语言预处理器
- 【C语言】预处理器
- c语言预处理器指令
- C语言预处理器详解
- C语言的预处理器
- C语言预处理器(十五)
- C语言再学习 -- C 预处理器
- C 语言预处理器(笔记)
- C语言复习之预处理器
- C语言预处理器的几个命令
- c语言预处理
- C语言预处理指令
- 第七周项目2 建立链队算法库
- jquery点击单张图片放大效果
- 硬盘监控
- jpa集合属性 排序
- Oracle数据库增加,删除,修改字段(整理)
- c语言预处理器
- 第八周项目4-字符串加密
- Java 集合:HashMap(put方法的实现 与 哈希冲突)
- PRCR-1079 CRS-5017 ORA-01031 DBCA
- eclipse快捷键总结
- 第八周 项目3 顺序串算法
- 第九周 猴子选大王(数组版)
- electron使用 sqlite3
- 第九周项目1-猴子选大王(数组)