C语言嵌套注释 《C陷阱与缺陷》中有一个有意思的问题:“某些C编译器允许嵌套注释。请写一个测试程序,要求:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译(无错误消息出现),但是这两种情况下程序执行的结果却不相同。 我觉得这对C的词法分析挺有意思的。要是聪明的您,有什么办法呢? 以下是作者给出的答案,确实很精妙,尤其第二个。 ——为了判断编译器是否允许嵌套注释,必须找到这样一组符号序列,无论是对于允许嵌套注释的编译器,还是不允许嵌套注释的编译器,它都是合法的;但是,对于两类不同的编译器,它却意味着不同的事物。这样一组符号序列不可避免地要涉及嵌套注释,让我们从这里开始讨论: 如果允许嵌套注释,上面的符号序列就等效于一个引号;如果不允许,那么就等效于一个字符串"*I"。因此,我们可以接着在后面跟一个注释开始符以及一个引号: /*/**/ "*/"/*" 在我用基本上类似于上面的形式解决这个问题之后,Doug McIlroy发现了下面这个让人拍案叫绝的解法:
上面利用一个特殊构造的字符串就完成了这个任务,果然精妙! 而当时我对这个特殊字符串推导时没有看到希望,用了宏来帮忙,设计了下面的程序: #define A /* aaa /* a*/ a
#define B */ bool CanNesting() { #ifdef B return false; #else return true; #endif }
posted on 2011-03-25 17:18 Tim 阅读(3735) 评论(0) 编辑 收藏 引用 所属分类: C/C++语言 |
|