一. #define和 #undef
#define这个预处理符号是大家常用的,主要用来定义一些常量和一些简单的表达式(函数),下面是一些例子
#define TABSIZE 200
int a[TABSIZE];int b[TABSIZE];
经过预处理步骤,这时发生替换,上面两个定义就会变成 int a[200];int b[200];
#undef是取消先前的#define 定义,如
#define TABSIZE 100
int a[TABSIZE];
#undef TABSIZE
#define TABSIZE 200
int b[TABSIZE]
经过预处理步骤后就是 int a[100]; int b[200];
函数宏定义接受2个特殊的处理符号#和 ##
#号的意思是把它后面参数的值用字符串的形式表达,例如
1.#define get(x) #x
2.cout<<get(222);---->cout<<#222--->cout<<"222";
##号的意思是把2个参数合并连接到一起,消除它们中间的空白符,例如
1.#define glue(x,y) x ## y
2. cout<<glue(yishi,haoxuexiao);----->cout<<yishi ## haoxuexiao--------->cout<<"yishihaoxuexiao"
二:条件定义
主要包括: #ifdef ,#ifndef,#if ,#endif,#else,#elif,主要用来进行条件编译
#ifdef TABSIZE
int a[TABSIZE]
#endif
在上例中,如果先前定义了TABSIZE,那么就回定义数组a,如果没有定义TABSIZE,那么数组a的定义就不会被执行(编译阶段)
#ifndef TABSIZE
#define TABSIZE 100
int a[TABSIZE]
#endif
在上例中,如果没有定义TABSIZE,那么自己定义TABSIZE=100,接着定义数组a,如果已经定义了TABSIZE,那么就不会定义数组a了
另外 #ifdef X===#if defineed X,#ifndef X===#if !defineed X
#if 常量表达式,例如 #if 20>30
三; #line number filename
当我们编译程序,程序有错误时,会输出错误的行数和文件名,#line定义就是结合了这两个,例如文件 test.c,
1.#include<stdio.h>
2.int main(void)
3.{
4. int i?;
5. return 0;
6.}
上面这个程序是有错误的,编译提示的错误是:
test.c: In function ‘main’:
test.c:4:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘?’ token
test.c:4:7: error: expected expression before ‘?’ token
此时我们看到提示的错误信息有以下几项:1.文件名字,是test.c,每行都有 2.错误的行数,我们可以看到是第四行出现了错误(总共7行,最后有1行是空)
我们对程序进行修改
1.#include<stdio.h>
2.int main(void)
3.{
4. #line 1 " 我的文件"
5. int i?;
6. return 0;
7.}
编译的结果是:
我的文件: In function ‘main’:
我的文件:1:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘?’ token
我的文件:1:7: error: expected expression before ‘?’ token
我们可以看到文件名变化了,同时错误指向了第1行,那么 #line 1的作用就是把它下一行的代码行数从1开始计数; 另外filename是可选的,即#line number就OK
四:#error expression
这个定义是用来终止编译过程的
#idndef __cplusplus
#error 需要c++编译器
#endif
当我们使用gcc时(c++编译器默认定义__cplusplus),因为没有定义__cplusplus,那么就会执行#error ...,这个表达式就会终止编译器
五:#include
这个大家都熟悉了,主要有两种形式 #include<>和#include""
六:#pragma
这个根据具体的编译器和平台的不同参数不同,主要是对编译的一些参数的配置
七:任何时候都被定义的宏
__LINE__:这个指明被编译文件的现在在哪一行
__FILE__:指明被编译文件的名字
__DATE__:以MM DD YYYY的形式指明现在的编译日期
__TIME__:以hh:mm:ss的形式指明现在的编译时间
__cplusplus:所有c++编译器都应该定义的常量。兼容c++标准的编译器中,这个值是>=199711L,根据符合c++标准版本的不同而不同