C~总结预处理指令

1 宏定义

 

1.1 #define

  • <ctype.h>中定义了很多有用的宏.
  • 用法:

#define 标识符 替换列表 #define 标识符(x1, x2, x3, …, xn) 替换列表

1.2 #undef

  • 与#define作用相反, 删除#define定义的宏.
  • 形如, #undef 标识符

1.3 #include

  • 格式, #include <文件名>, 从/usr/include系统路径中查找, 或#include "文件名", 从当前路径找, 允许绝对路径.
  • 作用, 将头文件定义的共享信息加到#include所在的文件.

1.4 条件编译

 

1.4.1 #if #ifdef #ifndef #elif #endif #else

形如, #if 表达式

#elif 表达式

#else

#endif

1.4.2 案例,

  • 注释代码包括注释
#if 0
...代码和注释
#endif
  • 提供默认宏定义
#ifndef ARRAY_SIZE
#define ARRAY_SIZE 11
#endif
  • 提供跨系统的移植性

#if defined UNIX … #elif defined WINDOWS … #endif

  • 避免重复包含同一个头文件

#ifudef HEADH *HEADH表示头文件名称* #define HEADH*头文件内容* #endif

1.5 #line

  • 格式, #line 数字行号, 或#line 数字行号 "文件名"
  • 作用, 改变编译器处理C源文件时源码的行号, #line位置之后的行号按照#line的定义开始.

例子, a.c的第2行处, 有#line 6 "b.c" 这样a.c中第3, 4..N行号, 就看成b.c的6, 7..N+3行号.

1.6 #pragma

  • 格式, #pragma 记号
  • 作用, 记号告诉编译器启用一些特定的功能.

1.7 #error

  • 格式, #error 错误消息
  • 作用, 预处理处理遇到#error时, 停止工作并输出错误消息.

2 宏运算符

 

2.1 #

  • 作用: 将宏参数转换为字符串字面量. 形如, #参数
  • 例如:

#define calc_square(i) printf(#i " * " #i " = %d", i * i), 预处理calc_square(2); -> printf("2 * 2 = %d", 2 * 2);

2.2 ##

  • 作用: 将前后2个记号在预处理替换后连结在一起, 若记号是宏参数则将其预处理后再连结.
  • 例如:

#define prefix_name(x) name_##x, 预处理prefix_name(dzh); -> name_dzh;

2.3 defined

  • 作用: 判断一个标识符是否用#define定义过. 形如, defined 标识符, 或defined(标识符).
  • 例如:

#if defined(DEBUG)
#endif

3 预定义宏

以下宏是预处理器内置定义的特殊含义的宏:

  • _FILE_

被编译文件的名字

  • _LINE__

被编译文件的行数

  • _DATE__

编译日期, 格式: mm dd yyyy

  • _TIME__

编译时间, 格式: hh:mm:ss

  • _STDC__

检测编译器是否用标准编译, 若是则值为1.

  • assert宏 用于错误检测

4 总结

C程序面对差异的环境, 如何提高程序的复用和通用性, 预处理是编译的辅助功能, 在工程开发中是十分有益的一项技术.

Date: 2012-12-09T20:52+0800

Author: dzh

Org version 7.9.2 with Emacs version 23

Validate XHTML 1.0

 

posted on 2013-04-30 17:47  戴忠  阅读(437)  评论(0编辑  收藏  举报