预处理指令
预处理器是一个小软件,它可以在编译前编译C程序。C语言因为依赖于预处理所以不同于其他的编程语
言。预处理器也是一个强大的工具,但同时也有许多难以发现的错误的根源,建议适度地使用它
宏定义:#define指令定义一个宏,#undef指令删除一个宏定义。
文件包含:#include 指令导致一个指定文件内容被包含到程序中。
条件编译。#if #ifdef #ifndef #elif #else #endif//#error #line #pragma
宏定义
简单宏
#define 标识符 替换列表------------#define N 100
int a[N]
主要用于那些“明示常量”这样程序会更易读,程序更容易修改
带参数的宏
#define 标识符(x1,x2,....xn) 替换列表
例如 :定义宏--#define MAX(x,y) ((x)>(y)? (x) : (y))
#define IS_EVEN(n) ((n)%2==0)
如果下面程序中有如下语句
i=MAX(j+k,m-n);
if(IS_EVEN(i)) i++;
预处理会将这些行为替换为
i=MAX((j+k)>(m-n) ? (j+k):(m-n));;
if(((i)%2==0)) i++;
在看下面一个更加复杂的宏:
#define TOUPPERC(c) ('a'<(c)&&(c)<'z' ? (c)-'a'+'A':(c))
在C语言库<ctype.h>中提供了大量的宏其中之一就是toupper与上面的宏TOUPPERC作用一样但是
效率更高,可移植性更好。
优点:程序可能会稍微快些,没有了储存上下文以及复制参数的开销
更加通用
#运算符
例如:#define PRINT_INT(x) printf("%d/n",x);
PRINT_INT(i/j);
如果这样:#define PRINT_INT(x) printf(#x "=%d/n",x)
PRINT_INT(i/j);
会变为
printf("i/j" "=%d/n", i/j);
##运算符
##运算符称为“记号粘合”
#define MK_ID(n) i##n
当MK_ID被调用时(MK_ID(1)) 得到一个i1记号;
如下:int MK_ID(1) , MK_ID(2) , MK_ID(3);-----处理后 int i1, i2 ,i3;
条件编译
#if指令和#endif指令
#define DEBUG 1
#if DEBUG
printf("Value of i: %d/n",i);
printf("Value of j: %d/n",j);
#endif
如果DEBUG 0 那这4行代码都消失
#ifdef指令和#ifndef指令
#elif指令和#else指令
如:#if 表达式1
当表达式1非0时需要包含的代码
#if
当表达式1为0表达式2非0时候包含的代码
#else
其他情况下包含的代码
#error
例如:一个程序在一台无法使用int型来存储大于100000的数的机器上不能编译。最大允许的int的INT_MAX宏
#if INT_MAX<100000
#error int type is too samll
#endif
#line指令
#line n /line n"文件名"
这条指令讲导致后面的行的编号编程 n ,n+1 ,n+2;
#pragma指令
#pragma指令为要求编译器质性某些特殊的操作提供一种方法。这条指令对非常大的程序或需要使用特定编译器的特殊功能的程序非常有用。
----内容摘自C语言设计现代方法