tags:

views:

364

answers:

3

I've noticed, using visual studio 2003, that I can "comment out" my comments to make them no longer be comments. This one needs an example:

If I have:

/*
int commented_out = 0;
*/

I can comment out the /* and */ with // and code within the /* and */ is no longer "commented out" (the text changes to non-comment color and the compiler treats it as code once again). Like so:

///*
int commented_out = 0;
//*/

I've found this is true for msvc 2003, is this normal C++ behavior or is it just a fluke that works with this compiler?

+9  A: 

It should work in any compiler as the // is encountered first in the input stream.

I tend to use #if 0 for this sort of stuff and change it to #if 1 to uncomment, shown here:

#if 0
    int commented_out = 0;
#endif

Then I don't have to worry about comment markers at all.

paxdiablo
+17  A: 

Yep, this is perfectly normal behavior. The C++ standard says that a /* is the start of a comment block only if it itself is not commented out. I often use what you've written above to comment or uncomment a block of code by adding/deleting one character. A nice little trick for switching between two blocks of code, one of which is always commented out is:

//*
code block 1 (uncommented)
/*/
code block 2 (commented)
//*/

Now, delete one slash from the start, and it becomes

/*
code block 1 (commented)
/*/
code block 2 (uncommented)
//*/

Not something to use in production code, but very useful for quick debugging changes.

Adam Rosenfield
Hadn't thought of that before. That's great.
Adam Jaskiewicz
cool trick! thanks!
rally25rs
+1  A: 

Actually this works in almost any language with C style block comments.

/*
int foo = 0;
/*/
int foo = 1;
//*/

or even XML comments

<!--->
a
<!-->
b
<!---->

unfortunately I'm drawing a blank on lua's lightsaber comments

--[[---------
---------]]--
GameFreak