我得到了一些代码, 里边有太多的 #ifdef。 我不想使用预处理器把所有的 #include 和 #ifdef 都扩展开, 有什么办法只保留一种条件的代码呢?

有几个程序 unifdef, rmifdef 和 scpp (selective C preprocessor) 正是完成这种工作的。 

11.1 这些机巧的预处理宏:  #define begin {  #define end }  你觉得怎么样?

 

11.3 书写多语句宏的最好方法是什么? 通常的目标是书写一个象包含一个单独的函数调用语句的宏。这意味着  ``调用者" 需要提供最终的分号, 而宏体则不需要。因此宏体不能为简单的括弧包围的复合语句, 因为如果这样, 调用的时候就会发生语法错 (明显是一个单独语句, 但却多了一个额外的分号), 就像在 if/else 语句的 if 分支中多了一个 else 分句一样。

所以, 传统的结局方案就是这样使用:

	#define MACRO(arg1, arg2) do {  /
		/* declarations */      /
		stmt1;		   /
		stmt2;		   /
		/* ... */	        /
		} while(0)	/* 没有结尾的 ; */

当调用者加上分号后, 宏在任何情况下都会扩展为一个单独的语句。 优化的编译器会去掉条件为 0 的 ``无效" 测试或分支, 尽管 lint 可能会警告。

如果宏体内的语句都是简单语句, 没有声明或循环, 那么还有一种技术, 就是写一个单独的, 用一个或多个逗号操作符分隔的表达式。例如, 问题 10.22 的第一个 DEBUG() 宏。这种技术还可以  ``返回" 一个值。

 

11.18 我有些旧代码, 试图用这样的宏来构造标识符  #define Paste(a, b) a/**/b 但是现在不行了。 这是有些早期预处理器实现 (如 Reiser) 的未公开的功能, 注释完全消失, 因而可以用来粘结标识符。 但 ANSI 确认 (如 K&R所言) 注释用空白代替。然而对粘结标识符的需求却十分自然和广泛, 因此 ANSI 引入了一个明确定义的标识符粘结操作符 --- ##, 它可以象这样使用

    #define Paste(a, b) a##b
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值