Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > C-preprocessor macro question

Reply
Thread Tools

C-preprocessor macro question

 
 
Charlie Zender
Guest
Posts: n/a
 
      12-24-2003
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, http://www.velocityreviews.com/forums/(E-Mail Removed), (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 **************


 
Reply With Quote
 
 
 
 
Arthur J. O'Dwyer
Guest
Posts: n/a
 
      12-24-2003

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:
(E-Mail Removed)
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

 
Reply With Quote
 
 
 
 
Derk Gwen
Guest
Posts: n/a
 
      12-24-2003
Charlie Zender <(E-Mail Removed)> 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.
 
Reply With Quote
 
Richard Bos
Guest
Posts: n/a
 
      12-24-2003
Derk Gwen <(E-Mail Removed)> wrote:

> Charlie Zender <(E-Mail Removed)> 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 ****-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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Dedicated Macro or Normal Macro? John Ortt Digital Photography 5 11-22-2005 12:43 PM
Macro lens on a camera with a macro setting??? mitchell.chris@gmail.com Digital Photography 2 09-28-2005 07:55 AM
in S.E. Asia : Canon EOS 300d with 100 macro ED vs. Nikon D70 with Nikon 105 macro ? J. Cod Digital Photography 0 09-29-2004 05:46 AM
#define macro to enclose an older macro with strings Dead RAM C++ 20 07-14-2004 10:58 AM
macro name from macro? D Senthil Kumar C Programming 1 09-21-2003 07:02 PM



Advertisments