解决/**/嵌套问题---条件编译:#if 0 statement #endif 帅帅哒洋办法
2015-05-06 11:43
435 查看
对于VS各个版本的编译器,对于代码注释,比较常用的是//和/**/,对于出现多层注释嵌套的问题,就有问题了,不支持/**/形式的嵌套。
》》嵌套的意义
先说一下嵌套的意义吧。如果不是动那些比较大的代码,可能也没有这个需求。
比如曾经你有一些代码:
code1 ;
code2 ;
code3 ;
某天,你发现code2的功能不用了,当然,从小我们就被教育,养成了注释的好习惯:
code1 ;
/* code2 ; */
code3 ;
因为有些暂时不用的东西以后可能又会想用了,重写一遍不如直接解除注释方便。
又某天,你发现这一大段都不想要了,那么?
/*code1 ;
/* code2 ;*/
code3 ; */
这样吗?可惜最常见的情况是编译器报一个错。。。
真正匹配起的是标红的两个注释。
所以,支持嵌套注释是非常有必要的。
在一个硕大的工程里面,code[1-3]可能是很长的一块,
更恶心的是,里面有很多别人写的东西,
你不会知道你的 "/*"符号会被哪里的"*/"给截止掉。
》》土办法和洋办法
我最早学会的是土办法,因为很多C++的教条都告诉我们尽量使用 "//",少用/**/。
这样至少有一个好处,就是你用/**/去包含//的时候不会有问题。
但如果要再包含一次,结果还是会被囧掉。
还有另外一个原因,就是我们可能会需要使用不能贯穿一行的注释。
int myfunc(int n /*number of elements*/, int *a/*pointer to the first element*/)
这个时候,//的用户者又跳出来了,发明一种新格式,并且写如规范:
int myfunc(
int n, // number of elements
int *a, // pointer to the first element
) ;
这样不就解决了注释符号的选择问题,而且看起来似乎可读性还变高了。
前人很happy地把这个写入规范中,后人当然不知道,这个“可读性变高”是土办法的副作用。
其实这些之所以为土办法,是因为他们还是没有解决注释嵌套的问题。
只是在通过种种书写上的方式,来尽量降低这个局限性带来的影响。
后来,无意中看到一个洋办法,真的很洋气啊。。。
其实我们都知道可以用 #if #endif 来条件编译,自己却没想到可以做嵌套用。
比如,前面的code,直接这样就行了:
#if 0
code1 ;
/* code2 ; */
code3 ;
#endif
这两个标记当然是可以嵌套的,因为预处理器会按照if的结构去解析它。
现在大多不建议用宏定义常量或者函数,因为有const和inline可以使用。
顺便小节一下,用预处理命令的主要几个地方:
1、 include guards。就是 #ifndef xx #define xx ..... #endif这个,用在头文件中。
2、 本篇提到的嵌套注释。#if 0 ... #endif
3、 debug信息的开启开关。 #ifdef _DEBUG ... #endif
至于用条件编译来解决什么跨平台的问题,我们大多数人都很少用到。
转自http://blog.chinaunix.net/uid-22330495-id-191645.html
》》嵌套的意义
先说一下嵌套的意义吧。如果不是动那些比较大的代码,可能也没有这个需求。
比如曾经你有一些代码:
code1 ;
code2 ;
code3 ;
某天,你发现code2的功能不用了,当然,从小我们就被教育,养成了注释的好习惯:
code1 ;
/* code2 ; */
code3 ;
因为有些暂时不用的东西以后可能又会想用了,重写一遍不如直接解除注释方便。
又某天,你发现这一大段都不想要了,那么?
/*code1 ;
/* code2 ;*/
code3 ; */
这样吗?可惜最常见的情况是编译器报一个错。。。
真正匹配起的是标红的两个注释。
所以,支持嵌套注释是非常有必要的。
在一个硕大的工程里面,code[1-3]可能是很长的一块,
更恶心的是,里面有很多别人写的东西,
你不会知道你的 "/*"符号会被哪里的"*/"给截止掉。
》》土办法和洋办法
我最早学会的是土办法,因为很多C++的教条都告诉我们尽量使用 "//",少用/**/。
这样至少有一个好处,就是你用/**/去包含//的时候不会有问题。
但如果要再包含一次,结果还是会被囧掉。
还有另外一个原因,就是我们可能会需要使用不能贯穿一行的注释。
int myfunc(int n /*number of elements*/, int *a/*pointer to the first element*/)
这个时候,//的用户者又跳出来了,发明一种新格式,并且写如规范:
int myfunc(
int n, // number of elements
int *a, // pointer to the first element
) ;
这样不就解决了注释符号的选择问题,而且看起来似乎可读性还变高了。
前人很happy地把这个写入规范中,后人当然不知道,这个“可读性变高”是土办法的副作用。
其实这些之所以为土办法,是因为他们还是没有解决注释嵌套的问题。
只是在通过种种书写上的方式,来尽量降低这个局限性带来的影响。
后来,无意中看到一个洋办法,真的很洋气啊。。。
其实我们都知道可以用 #if #endif 来条件编译,自己却没想到可以做嵌套用。
比如,前面的code,直接这样就行了:
#if 0
code1 ;
/* code2 ; */
code3 ;
#endif
这两个标记当然是可以嵌套的,因为预处理器会按照if的结构去解析它。
现在大多不建议用宏定义常量或者函数,因为有const和inline可以使用。
顺便小节一下,用预处理命令的主要几个地方:
1、 include guards。就是 #ifndef xx #define xx ..... #endif这个,用在头文件中。
2、 本篇提到的嵌套注释。#if 0 ... #endif
3、 debug信息的开启开关。 #ifdef _DEBUG ... #endif
至于用条件编译来解决什么跨平台的问题,我们大多数人都很少用到。
转自http://blog.chinaunix.net/uid-22330495-id-191645.html
相关文章推荐
- 条件编译解决/**/注释嵌套的问题(#if 0 #endif) (哈哈,写的很搞笑啊~转载的)
- MyEclipse不能自动编译解决方法总结(转)/debug时断点乱跳问题的解决办法
- 关于zhtread编译不过的问题解决办法
- CCS编译中常常遇到的问题以及解决办法
- 编译python模块要求安装vs2003问题的Hack解决办法
- ActiveMQ:No operations allowed after statement closed问题及解决办法
- Cordova编译Android 22 以上版本,中文目录出错问题的解决办法
- iOS 集成支付宝支付编译出现的问题及解决办法
- 关于Mysql com.mysql.jdbc.StatementImpl$CancelTask内存泄漏问题及解决办法
- NS3编译遇到的Python相关的问题解决办法
- 【小小问题集锦6之---查询条件非常复杂时解决效率不高的一个办法】
- MySQL问题贴3:Delphi第一次编译连接MySQl数据时缺少dll文件的解决办法
- 没有匹配 if 的非法 else 问题解决办法
- codeblocks编译遇到问题的可能解决办法
- C#条件编译选项:Conditional(代替#if...#endif)
- ubuntu10.10编译sniffit问题解决办法
- 【转】NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。------不错
- /usr/bin/ld: cannot find -lcblas /usr/bin/ld: cannot find -latlas 这两个问题的解决办法并编译成功
- 关于编译内核时候出现__gnu_mcount_nc的问题以及解决办法
- linux编译找不到apr问题解决办法