C/C++ preprocessor

预处理器

预处理器是在编译之前执行的一段程序,可以部分的改变我们的程序。

include

当预处理看到#include时会用指定的头文件代替#include

头文件保护符

头文件保护符依赖于预处理变量。预处理变量有两种状态:已定义和未定义。
#define定义一个预处理变量。
#ifdef当且仅当变量已定义为真。
#ifndef当且仅当变量未定义为真。
#ifdef#ifndef为真之后,后续操作遇到#endif结束。

assert预处理宏

预处理宏其实是一个预处理器变量。assert就是一个预处理宏,assert定义在<cassert>头文件中。它使用一个表达式作为它的条件:

1
assert(expr);

expr求值,如果为真,什么也不做,否则输出信息,终止程序执行。它用来检查某种错误条件,即当expr满足条件时什么也不做,当它出错时,就结束。

NDEBUG预处理变量

assert的行为依赖于一个名为NDEBUG的预处理器变量的状态。如果定义了NDEBUG,那么assert什么也不做。默认情况下没有定义NDEBUGassert执行检查。

其他函数预处理变量

C++预处理器定义了四个对于程序调试很有用的名字:
__FILE__
__LINE__
__TIME__
__DATA__

注意:C++编译器提供了__func__变量存放函数名字。

参考文献

1.《C++ Primer》第五版