我使用过的大多数语言都不支持递归评论。
递归评论的示例:
/*
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 "*/";
*/
这也会产生意外/不受欢迎的结果。
因此,虽然它可能是递归注释的问题,但我关于为什么这不是不这样做的理由的论点是,它已经是非递归注释的问题。作为程序员,我知道编译器的行为与此类似,我可以解决它。我不认为用递归评论来解决同样的问题会更加努力。
答案 0 :(得分:2)
我会举个例子,也许会更清楚:
/*
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 */";
*/
如果不解释评论中的内容,则无法解析评论中的评论。但你无法解释评论中的内容,因为它是一个评论,因此根据定义“人文”而不是“语言”。
答案 1 :(得分:2)
语言设计师选择不这样做是否有任何理由 实现这个?
这使得词法分析更难实现。
这看起来很复杂吗?
恕我直言,不,但这是主观的。
会有不良后果吗?
很难说。您已经发现即使是正常的块注释也可能会出现问题:
/* print ("*/"); */
答案 2 :(得分:1)
虽然C的多行注释无法嵌套,但使用#if 0 ... #endif
在C语言中或多或少可以实现递归注释的效果(我强烈建议您在禁用时使用它代码块,正是出于这个原因)。
即使是设计为像帖子一样愚蠢的C预处理器,也完全有能力处理嵌套注释,就像它必须能够处理带有错误条件的嵌套#if
指令一样。所以它并不是真的与任何难以定义或解析的东西有关,因为虽然它使注释更复杂,但它们仍然不会比预处理中的其他事情复杂。
但是,使用#if 0 ... #endif
当然要求您尝试排除的代码中没有任何不匹配的#endif
。
根本上,评论既不能(a)完全非结构化,也不能(b)递归。无论是通过偶然选择还是故意选择,C都带有(a) - 评论文本除了不包含注释终结符序列(或者诸如*??/<newline>/
之类的三字形等价物)之外,不必遵守任何语法约束。 / p>
答案 3 :(得分:0)
我相信它从来没有被考虑过,随着事物的发展它变成了一个“非重要”的功能。此外,它还需要更多验证。
示例场景......
MyLang版本1:目标
开发人员:嗯......我知道,每当我找到/*
时,我都会评论所有内容,直到下一个*/
- 简单!
MyLang版本1发布
1天后......
用户:呃......我不能做递归评论,帮助我。
支持:请等待。
30分钟后......支持经理 - &gt;开发人员:用户无法进行递归评论。
开发人员:(什么是递归......)坚持......
30分钟后
开发人员:是的,我们不支持递归评论。