Re: Preprocessor
On Jul 31, 2:07 pm, p...@informatimago.com (Pascal J. Bourguignon)
wrote:
"buch...@gmail.com" <buch...@gmail.com> writes:
is there a way to test if a variable is defined by a
preprocessor directive? Suppose, for example, I want to
simplify this code by using two macros:
Timer t1;
t1.start();
... // some action
t1.stop();
std::cout << "..." << endl;
#define TIMER_START(x) // defines timer tx and starts timing
#define TIMER_STOP(x) // stops timer tx and prints out the elapsed
time
However, the problem arises when I try to call
TIMER_START(1) twice in the same block since there's
redefinition of t1. Is there a way to extend the
TIMER_START(x) macro such that it would first test if the
timer tx exists to avoid compiler errors?
It would be better if you defined a scoping couple of macros.
Assume you want expanded code such as:
{
Timer tXYZ;
try{
tXYZ.start();
[BODY]
tXYZ.stop();
}catch(...){
tXYZ.stop();
throw;
}
}
Then it wouldn't matter if you used the same name in an
embedded version:
{
Timer tXYZ;
try{
tXYZ.start();
{
Timer tXYZ;
try{
tXYZ.start();
[BODY]
tXYZ.stop();
}catch(...){
tXYZ.stop();
throw;
}
}
tXYZ.stop();
}catch(...){
tXYZ.stop();
throw;
}
}
you would still have two different timers, and the references
to each are well scoped, lexically.
#define WITH_TIMER_BEGIN(TIMEOUT) \
do{ \
Timer CURRENT_TIMER; \
try{ \
CURRENT_TIMER.start(TIMEOUT); \
{ \
int CURRENT_TIMER=0; /* hides the real timer */
#define END_WITH_TIMER \
} \
CURRENT_TIMER.stop(); \
}catch(...){ \
CURRENT_TIMER.stop(); \
throw; \
} \
}while(0)
and write:
WITH_TIMER_BEGIN(Minute(3)){
do_something_slow();
}END_WITH_TIMER;
WITH_TIMER_BEGIN(Minute(3)){
do_something_slow();
WITH_TIMER_BEGIN(Second(15)){
do_something_not_too_slow();
}END_WITH_TIMER;
do_something_slow();
}END_WITH_TIMER;
Putting mismatched braces in a macro is a nice trick to render
the code unreadable. There are very few cases where it is
justified (although admittedly, this may be one). Why not just
use a class, which reads the timer in the constructor and the
destructor? (Presumably, you'll also want to capture the
results somewhere, so the constructor needs a reference to
that.)
Having said that... All his macro gains him is one line, that
which declares the variable. IMHO, it's not worth it.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34