boost_www | 17 Jul 03:47
Favicon

Re: Several questions on C++

hello Nat,

Thanks you very much for your explanation!

for 1), I never heard of that idiom. In fact, after playing with C++
for more thant 10 years, I am still keeping finding interesting corners
of the language. :)

What I get from your information is that, the do/while clause is 
a MUST-HAVE and is obviously intentional.

for 2), it seems that 'this->' is a question of coding style and generally
we could omit it.

I really appreciate your help! and I believe the moderator of the list
will not yell to us for such topic. :-)

B/Rgds
Max

> 1) I found code fragment like this, esp. in macro definitions:
> 
> do {      \
>           \
> // ...    \
> } while(0)
> 
> Why is the do/while clause needed here?

That's a macro idiom that dates back to classic C. It packages a 
compound statement { stmt1; stmt2; } as if it were a single statement.

If you write

#define YOURMACRO(arg) { stmt1; stmt2; }

and a subsequent coder writes this:

if (some_condition)
     YOURMACRO(1);
else
     std::cout << "Whoops, error.\n";

he or she will get a nasty surprise. It works to drop the semicolon 
after YOURMACRO(1), but that imposes a new requirement: some macros must 
be followed by semicolons, others must NOT be followed by semicolons, 
and the coder must know something about the macro's implementation to 
use it correctly.

If you write

#define YOURMACRO(arg) do { stmt1; stmt2; } while (0)

then it's appropriate (required) to write a semicolon after the macro 
invocation, and subsequent coders can do that consistently without 
needing to know which kind of macro this is.

> 2) I found large amount of code like this in a class implementation:
> 
> AClass::func()
> {
> 	this->func1();
> }
> 
> Why is 'this->' needed?

There are a few different reasons.

1. Some people write that as a stylistic preference, since it clarifies 
that you're referencing a data member rather than a local variable.

2. In some IDEs, when you write "this->", the IDE pops up a list of 
members from which to choose.

3. In some arcane scenarios such as a template subclass derived from a 
template base class, the language sometimes requires 
this->baseClassMember (though I believe MSVC still permits a plain 
baseClassMember reference as an extension).

But if you ask any more such questions on this list, the moderator might 
yell at both of us. ;-)
_______________________________________________
Boost-users mailing list
Boost-users <at> lists.boost.org

_______________________________________________
Boost-users mailing list
Boost-users <at> lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users

Gmane