Odd Macro Problem

K

kid joe

Hello all

Long time no posting! I've mostly been using Java these couple years, but
now I'm working on a C project again. The group seems a lot quieter than
it used to be and lots of familiar names no longer appear in the recent
post lists - quite a change!

Anyway, I have a macro that can be used like:

E(errno);

but for reasons of brevity I frequently use the form:

E(errno = EINVAL);

But I would like to be able to have two definitions such that it evaluates
to an active form like:

printf("%d\n", errno);
OR
printf("%d\n", errno = EINVAL);

and an inactive form that does nothing. The problem is, if I define the
macro as simply:

#ifdef INACTIVATE
#define E(val)
#else
#define E(val) printf("%d\n", (val))
#endif

then the inactive form will not emit the 'errno = EINVAL' expression
and set the value. If I define the inactive macro as:

#define E(val) (val)

that can emit a useless expression like:

errno;

Is there a way to write this macro to solve this problem and still
satisfy all of the other requirements?

--


( )
( )
G O O D ( ) M O R N I N G ! !
( )
) )
( ( /\
(_) / \ /\
________[_]________ /\/ \/ \
/\ /\ ______ \ / /\/\ /\/\
/ \ //_\ \ /\ \ /\/\/ \/ \
/\ / /\/\ //___\ \__/ \ \/
/ \ /\/ \//_____\ \ |[]| \
/\/\/\/ //_______\ \|__| \
/ \ /XXXXXXXXXX\ \
\ /_I_II I__I_\__________________\
I_I| I__I_____[]_|_[]_____I
I_II I__I_____[]_|_[]_____I
I II__I I XXXXXXX I
~~~~~" "~~~~~~~~~~~~~~~~~~~~~~~~
 
E

Eric Sosman

Anyway, I have a macro that can be used like:

E(errno);

but for reasons of brevity I frequently use the form:

E(errno = EINVAL);

But I would like to be able to have two definitions such that it evaluates
to an active form like:

printf("%d\n", errno);
OR
printf("%d\n", errno = EINVAL);

and an inactive form that does nothing. The problem is, if I define the
macro as simply:

#ifdef INACTIVATE
#define E(val)
#else
#define E(val) printf("%d\n", (val))
#endif

then the inactive form will not emit the 'errno = EINVAL' expression
and set the value. If I define the inactive macro as:

#define E(val) (val)

that can emit a useless expression like:

errno;

Is there a way to write this macro to solve this problem and still
satisfy all of the other requirements?

Live with the useless expression: it does no harm, aside
from (perhaps) eliciting a warning message from the compiler.

A better approach, I think, is to step back and ask yourself
why you want one macro to do two rather different things: be both
a debugging aid (I guess) and an integral part of the program logic.
You may get it to work, but the "do one thing well" principle seems
to suggest you shouldn't try unless there's a compelling reason.

"It's a floor wax *and* a dessert topping!" -- SNL

"Simplify, simplify!" -- HDT
 
S

Shao Miller

kid said:
#ifdef INACTIVATE
#define E(val)
#else
#define E(val) printf("%d\n", (val))
#endif

What about:

#ifdef INACTIVE
# define E(val) ((void)(val))
#else
# define E(val) (printf("%d\n", (val)))
#endif

? :)
 
H

Harald van Dijk

What about:

   #ifdef INACTIVE
   #  define E(val) ((void)(val))
   #else
   #  define E(val) (printf("%d\n", (val)))
   #endif

? :)

Your solution, while valid, was posted more than three months after
the previous post in the thread, which already suggested the same
thing.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top