一段简短的测试代码如下
const int NUM_1 = 1;
const int NUM_2 = 2;
const int NUM_3 = 3;
const int NUM_4 = 4;
const int NUM_5 = 5;
#define TEST_NUM( number ) \
cout<<NUM_##number<<endl
int main( void )
{
TEST_NUM( 1 );
return 1;
}
输出结果:1
这里要注意的是##宏,它可以把位于它左右两边的符号连接成一个符号,如果#define宏写成这样
#define TEST_NUM( number ) \
cout<<NUM_number<<endl
那就错了,这时编译器会因为NUM_number是未定义的而报错,而NUM_##number在调用宏TEST_NUM(1)之后,将number替代,NUM_##1也就是NUM_1。
这个宏到底有什么用呢,请看下面这个例子(参见《编写可读代码的艺术》P88~P89)
void AddStats( const Stats& add_from, Stats* add_to )
{
add_to->set_total_memory( add_from.total_memory() + add_to->total_memory() );
add_to->set_free_memory( add_from.free_memory() + add_to->free_memory() );
add_to->set_swap_memory( add_from.swap_memory() + add_to->swap_memory() );
add_to->set_status_string( add_from.status_string() + add_to->status_string() );
add_to->set_num_processes( add_from.num_processes() + add_to->num_processes() );
...
}
这段代码很长,但是其中很多内容都是相似的,尽管宏不被推荐经常使用,但是这里使用宏可以使代码简洁明了
void AddStats( const Stats& add_from, Stats* add_to )
{
#define ADD_FIELD( field ) \
add_to->set_##field( add_from.field() + add_to->field() )
ADD_FIELD( total_memory );
ADD_FIELD( free_memory );
ADD_FIELD( swap_memory );
ADD_FIELD( status_string );
ADD_FIELD( num_processes );
#undef ADD_FIELD
}