By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,413 Members | 1,023 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,413 IT Pros & Developers. It's quick & easy.

C-preprocessor macro question

P: n/a
Hi,

I want to have a CPP macro that tests the value of a token and
returns the string "No" if the token is undefined (or 0) and
returns "Yes" if the token is defined (non-zero).

Then I can have C code that self-diagnoses its configuration with,
e.g.,

#define TKN2YESNO(x) ((x)==0 ? ("No"):("Yes"))
(void)fprintf(stderr,"The token FOO is defined: %s",TKN2YESNO(FOO));
(void)fprintf(stderr,"The token BAR is defined: %s",TKN2YESNO(BAR));

However, my definition of TKN2YESNO() does not work.
The GCC compiler on Linux flags an when I invoke TKN2YESNO() as above:

nco_scm.c:195: error: `FOO' undeclared (first use in this function)

Any help in understanding the cause of this error and how to correct
it to achieve the desired functionality would be appreciated!

Thanks,
Charlie
--
Charlie Zender, su*****@uci.edu, (949) 824-2987, Department of Earth
System Science, University of California, Irvine CA 92697-3100
Visiting NCAR 12/13/03--1/17/04: ***********************************
Voice/FAX: (303) 497-1724/1348, Office: Mesa Lab 259b **************
Nov 14 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a

On Tue, 23 Dec 2003, Charlie Zender wrote:

I want to have a CPP macro that tests the value of a token and
returns the string "No" if the token is undefined (or 0) and
returns "Yes" if the token is defined (non-zero).
In general I believe this is impossible, but someone may yet
prove me wrong. To what would your hypothetical macro evaluate in
the following "corner cases"?

#define FOO
#define FOO 0
#define FOO 0+0
#define FOO "bar"
#define FOO +
#define FOO if

Should it yield "Yes", "No", some other defined result, or would
it be allowed to crash completely? Or are you just looking for a
macro to yield "Yes" or "No" based on the integer value of a
#defined or un#defined macro -- in that case, I think you might
be looking for something as simple as

#define P(x) x
#define YESNO(foo) (P(foo)+0)? "Yes": "No")

#define foo 42 yields "Yes"
#define foo 0 yields "No"
#define foo yields "No"

but it may not like complicated expressions.

Then I can have C code that self-diagnoses its configuration with,
e.g.,

#define TKN2YESNO(x) ((x)==0 ? ("No"):("Yes"))
(void)fprintf(stderr,"The token FOO is defined: %s",TKN2YESNO(FOO));
(void)fprintf(stderr,"The token BAR is defined: %s",TKN2YESNO(BAR));

However, my definition of TKN2YESNO() does not work.
The GCC compiler on Linux flags an when I invoke TKN2YESNO() as above:

nco_scm.c:195: error: `FOO' undeclared (first use in this function)


This Won't Work (TM). If the token 'FOO' is *completely* undefined,
it won't macro-expand to anything, and you'll be left with 'FOO',
which the compiler will then treat like any other identifier -- as
if it were a variable name or something. And you'll get errors.
If this is what you want, you'll have to be a *lot* more specific
about what counts as "defined" and what doesn't, and maybe someone
will be nice enough to whip up a hack like the "month-day-year"
preprocessor hack Martin Dickopp did in this thread:
92**************************@posting.google.com
For example, you might get somewhere useful by stringizing the
thing. Other than that, I think you're stuck with

#if defined(foo) && (foo != 0)
...
#endif

which is tedious.

HTH,
-Arthur

Nov 14 '05 #2

P: n/a
Charlie Zender <ze****@uci.edu> wrote:
# Hi,
#
# I want to have a CPP macro that tests the value of a token and
# returns the string "No" if the token is undefined (or 0) and
# returns "Yes" if the token is defined (non-zero).

As a macro processor, CPP is fatally crippled. In particular you cannot
assume it will permit an #if or #ifdef within a #define. I would suggest
using a widely available real macro processor, perhaps m4, or to use a
scripting language like perl or Tcl as if a macro processor.

--
Derk Gwen http://derkgwen.250free.com/html/index.html
Leave it to the Catholics to destroy existence.
Nov 14 '05 #3

P: n/a
Derk Gwen <de******@HotPOP.com> wrote:
Charlie Zender <ze****@uci.edu> wrote:
# I want to have a CPP macro that tests the value of a token and
# returns the string "No" if the token is undefined (or 0) and
# returns "Yes" if the token is defined (non-zero).

As a macro processor, CPP is fatally crippled.
As a C preprocessor, though, the C preprocessor is, if anything,
dangerously overpowered and therefore prone to abuse. As a second-tier
programming language to munge the outcome of your main programming
language it lacks fuck-around-ability power, true, but that's probably
just as well.
In particular you cannot assume it will permit an #if or #ifdef
within a #define.


Actually, you can (indeed, must) assume that it will _not_ permit
complete preprocessing commands within the expansion of a preprocessor
macro.

Richard
Nov 14 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.