看Karto-slam的源码经常遇到C++预处理指令,以前遇到C++预处理指令,都是遇到一次查找一次(无语)
常见C++预处理指令
1.#空指令,无任何效果
2. #include包含一个源代码文件
3. #define定义宏
4. #undef取消已定义的宏
5. #if如果给定条件为真,则编译下面代码
6. #ifdef如果宏已经定义,则编译下面代码
7. #ifndef如果宏没有定义,则编译下面代码
8. #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码(类似一个if...else...)
9. #endif结束一个#if……#else条件编译块
10. #error停止编译并显示错误信息
注意:多见到这个是下面的一个预编译指令组合
#ifdef
(语句)
#endif
(1) #define定义宏
定义宏表示特定内容的标识符。预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。记住仅仅是进行标识符的替换。
在C++中,"宁可以编译器替换预处理器"强调使用const来定义常量
#define ASPECT_RATIO 1.653 (前者代表后者)
const double AspectRatio=1.653; ///首先考虑这个
#include <stdio.h>
#define MAX(x,y) (((x)>(y))?(x):(y))
#define MIN(x,y) (((x)<(y))?(x):(y))
int main(void)
{
#ifdef MAX //判断这个宏是否被定义printf("3 and 5 the max is:%d\n",MAX(3,5));
#endif
#ifdef MINprintf("3 and 5 the min is:%d\n",MIN(3,5));
#endifreturn 0;
}/** (1)三元运算符要比if,else效率高* (2)宏的使用一定要细心,需要把参数小心的用括号括起来,* 因为宏只是简单的文本替换,不注意,容易引起歧义错误。
*/
(2)#ifdef,#ifndef,#endif...的使用
以上这些预编译指令,都是条件编译指令.将决定那些代码被编译,那些代码不被编译.
#include <stdio.h>
#define DEBUG
main()
{
#ifdef DEBUG //判断DEBUG是否被定义了printf("yes ");
#endif#ifndef DEBUGprintf("no ");
#endif
}/*#endif用于终止#if预处理指令。*/
//#ifdefined等价于#ifdef;
//#if!defined等价于#ifndef