C++ 在C+中使用嵌套注释快速(取消)激活代码块时存在危险+;

C++ 在C+中使用嵌套注释快速(取消)激活代码块时存在危险+;,c++,comments,C++,Comments,我目前正在使用嵌套注释在测试期间快速激活/停用代码,我这样做的方式如下: //* First Case, Activated DoSomething(); /**/ /* Second Case, De-Activated DoSomethingElse(); /**/ 我可以通过简单地添加或删除“/”来激活、停用代码块 编译器警告我这一点,因为嵌套注释是不好的,但实际上,使用这些注释有危险吗?是的,您经常会导致过度注释或欠注释,并使非预期代码处于活动状态,这将使调试非常混乱。使用/更可靠-

我目前正在使用嵌套注释在测试期间快速激活/停用代码,我这样做的方式如下:

//* First Case, Activated
DoSomething();
/**/

/* Second Case, De-Activated
DoSomethingElse();
/**/
我可以通过简单地添加或删除“/”来激活、停用代码块


编译器警告我这一点,因为嵌套注释是不好的,但实际上,使用这些注释有危险吗?

是的,您经常会导致过度注释或欠注释,并使非预期代码处于活动状态,这将使调试非常混乱。使用
/
更可靠-您需要输入更多,但更容易预测。

人们通常是这样做的:

#if 0
//...
#endif


这不是一个直接的答案,但您是否考虑过使用ifdef

#define DOSOMETHING

#ifdef DOSOMETHING
DoSomething();
#else
DoSomethingElse();
#endif

为什么您觉得需要频繁地打开和关闭代码块?很可能,你在更高层次上做错了什么

也许您应该使用源代码管理,只需创建两个(或更多)分支,即可测试不同版本的代码

或者,您应该重构代码,这样,您就不需要注释整个代码块,只需要更改单个函数调用


像这样滥用嵌套注释并没有什么错,但它会使代码更难阅读,并且它解决了一个通常应该在完全不同的级别上解决的问题。

以下是您遇到麻烦的原因:

//* First Case, Activated
DoSomething();
/**/

/* Second Case, De-Activated
/* Comment about DoSomethingElse */
DoSomethingElse();
/**/
现在,将执行第二个案例,因为关闭常规注释将关闭注释,编译器不会检测到任何错误

当然,这可以通过从不使用
/**/
风格的注释来避免,这取决于您的环境是否合理。语法突出显示编辑器(甚至包括堆栈溢出答案编辑器)将提示您发生了什么。但为什么要引入这种可能性呢


这也属于“可爱”的范畴。你混合了两种不同的注释语法。只要每个人都明白发生了什么,并且遵守规则,你就会没事的。但一旦有人不知道,你就有麻烦了。

你在使用哪种编译器?我确信我毫无怨言地使用了MSVC的这个技巧。@Mark Ransom Secret!虽然它主要遵守GCC…但我喜欢使用
#ifdef BLAH_REMOVE
BLAH_DEBUG
,因为这样在我使用ifdef时,很容易找到它们。请注意使用的标识符。我曾经和一个家伙一起工作,他使用了
#ifdef OUT
。后来,他把它改成了
。#如果我不相信你被定义出来了
,当某个东西被定义出来的时候。是的,那更干净了,我不知道为什么我不会想到这个。。。我猜旧习惯仍然存在(^^^('特别是坏习惯:p)仅仅为两个小代码块创建分支真的是一个更好的主意吗?我问这个问题是因为我们的VC不支持分支,所以我不能测试它。我也是一个人在编写代码,所以没有问题。如果您的VCS不处理分支,您需要切换到处理分支的VCS。:)但我不知道你的代码是什么样的,你需要打开/关闭哪些代码块,或者你在什么约束下工作。在您的情况下,使用嵌套注释可能是更好的选择。但大多数时候,对大多数人来说,解决方案应该是我建议的方案之一。
//* First Case, Activated
DoSomething();
/**/

/* Second Case, De-Activated
/* Comment about DoSomethingElse */
DoSomethingElse();
/**/