Odd Macro Problem

M

Michael B Allen

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?

Thanks,
Mike
 
E

Eric Sosman

Michael said:
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?

No, because "all the other requirements" leaves too much
to the imagination ... Nonetheless, I'll don my Carnak The
Magnificent turban, dust off the Magic Eight-Ball, oil the
Ouija board, cast the yarrow stalks, burn a chicken feather,
and intone:

YE MAY BE WELL-PLEASED BY ONE FROM YE OLDE LISTE:

#define E(val) (val)
/* "Useless expression," pfui. Damn the torpedoes! */

#define E(val) ((void)(val))
/* Still useless, but perhaps less noisy. */

#define E(val) report_error(val)
/* Let the function decide what to do, if anything. */

AN NONE OF THESE PLEASE YE, ABANDON THY LOVE OF "BREVITY"
AND ESCHEW YON SIDE-EFFECTS IN YR MACRO ARGUMENTS. TREMBLE,
MORTAL, FOR THOU HAST BEEN WARNED!

(Alarums and excursions. Blinding lightning and
cataclysmic thunder. When sight returns, the Oracle has
vanished, leaving behind only a whiff of brimstone and one
small demon buzzing around in hope of finding Cyrano.)
 

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

Similar Threads

Odd Macro Problem 3
Adding adressing of IPv6 to program 1
Linux: using "clone3" and "waitid" 0
preprocessor macro problem 3
MACRO help 23
Macro re-entrancy problem 1
wcstombs() problem 16
Odd benchmark behavior 9

Members online

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,898
Latest member
BlairH7607

Latest Threads

Top