现在的位置: 首页 > 综合 > 正文

C++预处理器

2013年09月02日 ⁄ 综合 ⁄ 共 1630字 ⁄ 字号 评论关闭

C++预处理器
————
2013-3-10

http://blog.csdn.net/shunqiziranhao007/article/details/8655924

————
msdn关于预处理器的参考文档。

http://msdn.microsoft.com/en-us/library/y4skk93w%28v=vs.100%29.aspx

有兴趣可以看看《C++语言的设计和演化V1cn》,第18章,C语言预处理器。

————
#include
————
用来包含文件(不只是头文件,源文件等也可以)。两种形式,
#include <xx>
#include "xx.h"
前者<>用来引用标准库头文件,编译器只搜索包含标准库头文件的默认目录。
后者""常用来引用自定义的头文件,首先搜索正在编译的源文件所在的目录,找不到时再搜索包含标准库头文件的默认目录。如果把头文件放在其他目录下,为了查找到它,须在双引号中指定从源文件到头文件的相对路径。
C语言中用stdio.h,到了C++还是用cstdio吧。

————
#define
————
定义符号常量
#define NUM 10
改用const吧,更灵活。
const int class::num = 10;

定义子程序
#define MAX(a, b) ((a) > (b)) ? (a) : (b)
改用inline函数吧。

字符串
#define XX(a) cout << #a

字符串拼接
#define XX(a, b) a##b

可变参
#define FUN(s, ...) printf(s, __VA_ARGS__);
FUN("%d %s\n", 2, "a")

————
#undef
————
删除一个符号,作用跟#define相反。

————
#ifdef 或 #if defined 如果定义了一个符号, 就执行操作
#ifndef 或 #if !defined 如果没有定义一个符号,就执行操作

头文件保护符
#ifndef XX_XX_H
#define XX_XX_H
……
#endif

————
#if
#else
#elif
#endif
用于版本控制
注释掉一些代码
#if 0
……
#endif

————
预定义宏
————
这些可以用来调试。
__LINE__ 当前代码行号,十进制整数
__FILE__ 源文件名,字符串字面量
__DATE__ 源文件的编译日期,字符串字面量,格式mmm dd yyyy其中mmm是月份如Jan、Feb等 dd是01-31 yyyy是四位的年份
__TIME__ 源文件的编译时间,也是字符串字面量格式是hh:mm:ss
__STDC__ 这取决于实现方式,如果编译器选项设置为编译标准的C代码,通常就定义它,否则就不定义它
__cplusplus 在编译C++程序时,它就定义为199711L,根据这个可以判断源代码文件是C文件还是C++文件。

————
#line
————
重新定义当前行号和文件名。
#line 123 "xxx"
将__LINE__改为了123,__FILE__改为了"xxx"。

————
#error
————
在预处理阶段,如果出现了错误,则#error指令可以生成一个诊断 消息,并显示为一个编译错误,同时中止编译。
#error "here is error"

————
#pragma
————
专门用于实现预先定义好的选项,其结果在编译器说明文档中进行了详细的解释。编译器未识别出来的#pragma指令都会被忽略。
VC常用的,指定库文件。
#pragma comment(lib, "xx.lib")
去除某些警告
#pragma warning(push)
#pragma warning(disable:1234)
#include <xx.h>
#pragma warning(pop)

————
assert
————
头文件,#include <cassert>
assert(表达式)
当NDEBUG未定义时,assert宏就求解表达式的值。
assert(1 == 1),表达式为真,通过
assert(1 == 0),表达式为假,输出信息终止程序执行。
可以用来调试程序的。

抱歉!评论已关闭.