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
原创粉丝点击