c语言预处理器

本文参考自《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##n
int 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 small
endif
     如果试图在16位的机器上编译这个程序,将会产生错误:Error directive:int type is too small
     #line可以改变__LINE__宏的值,即改变行号。
     #pragma指令可以包含libs库等,具体作用比较复杂,比如:
#pragma comment(lib, "ws2_32.lib")//装载winsock2的静态链接库




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值