我使用过的大多数语言都不支持递归注释。
递归注释示例:
/*
for (int j = 0; j <= SourceTexture.Height; j += SampleSize)
{
...
}
// Comment within comment below:
/*for (int i = 0; i < TextureColour.Length; i++)
{
...
}*/
sourceTexture.SetData<Color>(TextureColour);
*/编辑:到目前为止,我理解答案的论点(当您在字符串中有注释标记时会出现问题)。然而,我困惑的原因是你现在有了这个问题。
例如,我知道下面的代码不会给出预期的结果。
/*
char *str = "/* string";
// Are we now 1 level inside a comment or 2 levels?
*/
printf("Hello world");
/*
char *str2 = "string */";
*/但在我看来,这与以下情况下的意外结果并无不同:
/*
CODE "*/";
*/这也会产生意想不到的/不希望的结果。
因此,虽然这可能是递归注释的一个问题,但我认为这并不是不这样做的原因,因为它已经成为非递归注释的一个问题。作为一名程序员,我知道编译器的行为是这样的,我就是这样做的。我不认为用递归注释来解决相同的问题需要付出更多的努力。
发布于 2011-10-24 09:09:01
有什么理由让语言设计者选择不去实现这一点呢?
这就使得词法分析更难实现。
这看起来很复杂吗?
IMHO,不,但这是主观的
会不会产生意想不到的结果?
很难说。您已经发现,即使是正常的块注释也会产生问题:
/* print ("*/"); */我知道有嵌套块注释的两种语言:Haskell和弗雷格。
发布于 2011-10-24 08:42:09
我会举一个例子,也许会更清楚:
/*
char *str = "/* string";
// Are we now 1 level inside a comment or 2 levels?
*/
printf("Hello world. Will this be printed? Or is it a comment?");
/*
char *str2 = "string */";
*/如果不解释注释中的内容,就无法解析注释中的注释。但是你不能解释评论里面的内容,因为它是一种评论,所以从定义上来说,“人类文本”而不是“语言”。
发布于 2011-10-24 10:02:09
虽然C的多行注释不能嵌套,但递归注释的效果可以或多或少地在C中使用#if 0 ... #endif实现(为此,我强烈建议您在禁用代码块时使用它)。
即使是设计成像post一样愚蠢的C预处理器,也完全能够处理嵌套的注释,就像它必须能够处理带有假条件的嵌套#if指令一样。因此,这与任何很难定义或解析的东西并没有什么关系,因为尽管它使注释更加复杂,但是它们仍然不会比在预处理中完成的其他事情更复杂。
但是,使用#if 0 ... #endif当然要求在您试图排除的代码中不存在任何不匹配的#endif。
从根本上说,注释不能同时是(a)完全非结构化的和(b)递归的。不管是偶然的还是深思熟虑的选择,C已经与(a) -注释文本一起走了,除了不包含注释-终止符序列(或类似于*??/<newline>/的三角图)之外,不需要遵守任何语法约束。
https://stackoverflow.com/questions/7872981
复制相似问题