9.6 预处理器的更多特征

前面说过,我们几乎总是希望使用内联函数代替预处理器宏。然而当需要在标准C预处理器(通过继承也是C++预处理器)里使用3个特殊特征时却是例外:字符串定义、字符串拼接和标志粘贴。字符串定义在本书的前面已作了介绍,字符串定义的完成是用#指示,它容许取一个标识符并把它转化为字符数组,然而字符串拼接在当两个相邻的字符串没有分隔符时发生,在这种情况下字符串组合在一起。在写调试代码时,这两个特征特别有用。

9.6 预处理器的更多特征 - 图1

上面的这个定义可以打印任何变量的值。也可以得到一个跟踪信息,在此信息里打印出它们执行的语句。

9.6 预处理器的更多特征 - 图2

s将输出语句字符。第2个s重申了该语句,所以这个语句被执行。当然,这可能会产生问题,尤其是在一行for循环中。

9.6 预处理器的更多特征 - 图3

因为在TRACE()宏里实际上有两个语句,所以一行for循环只执行第一个。解决办法是在宏中用逗号代替分号。

9.6.1 标志粘贴

标志粘贴直接用“##”实现,在写代码时是非常有用的。它允许设两个标识符并把它们粘贴在一起自动产生一个新的标识符。例如:

9.6 预处理器的更多特征 - 图4

每次调用FIELD()宏,将产生一个保存字符数组的标识符和另一个保存字符数组长度的标识符。它不仅易读而且消除了编码出错,使维护更容易。