我得到了一些代码, 里边有太多的 #ifdef。 我不想使用预处理器把所有的 #include 和 #ifdef 都扩展开, 有什么办法只保留一种条件的代码呢?
2008-01-08 22:55
387 查看
有几个程序 unifdef, rmifdef 和 scpp (selective C preprocessor) 正是完成这种工作的。
11.1 这些机巧的预处理宏: #define begin { #define end } 你觉得怎么样?
11.3 书写多语句宏的最好方法是什么? 通常的目标是书写一个象包含一个单独的函数调用语句的宏。这意味着 ``调用者" 需要提供最终的分号, 而宏体则不需要。因此宏体不能为简单的括弧包围的复合语句, 因为如果这样, 调用的时候就会发生语法错 (明显是一个单独语句, 但却多了一个额外的分号), 就像在 if/else 语句的 if 分支中多了一个 else 分句一样。
所以, 传统的结局方案就是这样使用:
当调用者加上分号后, 宏在任何情况下都会扩展为一个单独的语句。 优化的编译器会去掉条件为 0 的 ``无效" 测试或分支, 尽管 lint 可能会警告。
如果宏体内的语句都是简单语句, 没有声明或循环, 那么还有一种技术, 就是写一个单独的, 用一个或多个逗号操作符分隔的表达式。例如, 问题 10.22 的第一个 DEBUG() 宏。这种技术还可以 ``返回" 一个值。
11.18 我有些旧代码, 试图用这样的宏来构造标识符 #define Paste(a, b) a/**/b 但是现在不行了。 这是有些早期预处理器实现 (如 Reiser) 的未公开的功能, 注释完全消失, 因而可以用来粘结标识符。 但 ANSI 确认 (如 K&R所言) 注释用空白代替。然而对粘结标识符的需求却十分自然和广泛, 因此 ANSI 引入了一个明确定义的标识符粘结操作符 --- ##, 它可以象这样使用
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
相关文章推荐
- 我得到了一些代码, 里边有太多的#ifdef。我不想使用预处理器 把所有的#include 和#ifdef 都扩展开, 有什么办法只保留一种 条件的代码呢?
- 今天早晨想出了一种得到n以下所有素数的一种办法,觉得挺有意思,贴出来给大家看看!
- 内存使用太多,程序出错有什么解决办法吗
- MTK当修改一些代码时,使用什么编译命令可以最有效率
- [J2EE]使用 EJB 组件你需要了解些什么呢?--是一些关于使用条件的判断标准
- Android 当修改一些代码时,使用什么编译命令可以最有效率
- [FAQ03127] 当修改一些代码时,使用什么编译命令可以最有效率
- 当修改一些代码时,使用什么编译命令可以最有效率
- 市面上所有号称"虚拟机","防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加
- jquery的html()方法,不是输出所有的html标签,比如div标签,明明有,使用html()方法中得到的html代码中,就是没有
- 当修改一些代码时,使用什么编译命令可以最有效率
- MTK平台,当修改一些代码时,使用什么编译命令可以最有效率
- MTK平台,当修改一些代码时,使用什么编译命令可以最有效率
- MTK-当修改一些代码时,使用什么编译命令可以最有效率
- 当修改一些代码时,使用什么编译命令可以最有效率
- Android 当修改一些代码时,使用什么编译命令可以最有效率
- 移除所有子 View 时不使用循环代码的一种方式
- Ajax 得到的值对全局变量赋值没有起作用解决办法和 Jquery append()进去的动态代码 点击的js没起作用
- VM中使用svn检出代码出现Password for '(null)' GNOME keyring问题的解决办法
- 所有图片格式转eps的一种更好的办法(没有多余空白区域,无需裁剪eps)