关于宏的一点总结(持续更新)

一段简短的测试代码如下

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
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值