预处理包括:宏定义、文件包含、条件编译
宏定义
1. 用无参宏定义一个简单的常量
#define PI 3.14 把程序中出现的PI全部换成3.14
2.参数替换
#define S(r) ((r)*(r))
注意:
如果是这种情况:#define S(r) r*r
/*some code*/
map=S(a+b);
这里map的值为 a+b*a+b //宏定义只是替换,不做表达式求解
3.函数定义
#define MAX(a,b) (a<b)?a:b
注意: ""内的东西不会被宏替换
#include<iostream>
#define PI 3.14
#define TURE 1
#define FALSE 0
#define MAX(a,b) (a>b)?a:b
#define S(r) r*r
#define NAME "jim"
typedef int age;
int main(){
age jim=10;
age lucy=18;
int max=MAX(jim,lucy);
std::cout<<max*PI<<std::endl; //PI is 3.14
int s=S(2+2);
std::cout<<s<<std::endl; //s is 8,2+2*2+2
std::cout<<NAME<<std::endl<<"NAME"<<std::endl; //NAME is jim ,but "NAME" cannot be replaced
return TURE;
}
在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。
#include <stdio.h>
#define paster(n) printf( "token " #n" = %d\n ", token##n )
int main()
{
int token9=10;
paster(9);
return 0;
}
输出为token 9 = 10
条件编译
形式1
#ifdef 标识符
程序段 I
#else
程序段 2
#endif
它的作用是当 “ 标识符”已经由#define定义过了。则编译“ 程序段 1 ” 。 否则编译“ 程序段 2 ” 。其中如果不需要编译“ 程序段 2 ”。则上述形式可以变换 为:
#ifdef 标识符
程序段 1
#endif
形式2
#ifndef 标识符
# define 标识符
程序段 1
#else
程序段 2
#endif
它的作用是当 “ 标识符 没有由# define定义过。 则编译“程序段 1”。否则编译“程序段 2” 。同样当无“ 程序段2 ”时。则上述形式变换为:
# ifndef 标识符
# define 标识符
程序段 1
#endif
形式3
#if 表达式
程序段 1
#else
程序段 2
#endif 它的作用是 当“表达式”值为真时。编译程序段1。否则则编译程序段2。同样 当无程序段 2时,则上述形式变换为 :
#if 表达式
程序段 1
#endif
以上三种形式的条件编译预处理结构都可以嵌套使用。 当# else后嵌套 # if 时,可以使用预处理命令 # e l i f , 它相当于 # e l s e# i f 。在程序中使用条件编译主要是为了方便程序的调试和移植。
文件包含
#include "文件名"
或
#include <文件名>
参考资料:
http://baike.baidu.com/view/1441209.htm#7