Stringizing

From: George (greerga@DRAGON.HAM.MUOHIO.EDU)
Date: 08/16/97


On Sat, 16 Aug 1997, Daniel Koepke wrote:

>You'll have to do a bit of work to get this to work (probably, anyway), and
>it isn't the best it can be [if you figure out how to "stringify" things
>with GCC you might be able to get some extended information, but I'm
>uncertain how to do that].  But this is the basic code.  Essentially it

11.17:  I'm trying to use the ANSI "stringizing" preprocessing operator
        `#' to insert the value of a symbolic constant into a message,
        but it keeps stringizing the macro's name rather than its value.

A:      You can use something like the following two-step procedure to
        force a macro to be expanded as well as stringized:

                #define Str(x) #x
                #define Xstr(x) Str(x)
                #define OP plus
                char *opname = Xstr(OP);

        This code sets opname to "plus" rather than "OP".

        An equivalent circumlocution is necessary with the token-pasting
        operator ## when the values (rather than the names) of two
        macros are to be concatenated.

        References: ANSI Sec. 3.8.3.2, Sec. 3.8.3.5 example; ISO
        Sec. 6.8.3.2, Sec. 6.8.3.5.

and later:

11.18:  What does the message "warning: macro replacement within a
        string literal" mean?

A:      Some pre-ANSI compilers/preprocessors interpreted macro
        definitions like

                #define TRACE(var, fmt) printf("TRACE: var = fmt\n", var)

        such that invocations like

                TRACE(i, %d);

        were expanded as

                printf("TRACE: i = %d\n", i);

        In other words, macro parameters were expanded even inside
        string literals and character constants.

        Macro expansion is *not* defined in this way by K&R or by
        Standard C. When you do want to turn macro arguments into
        strings, you can use the new # preprocessing operator, along
        with string literal concatenation (another new ANSI feature):

                #define TRACE(var, fmt) \
                        printf("TRACE: " #var " = " #fmt "\n", var)

        See also question 11.17 above.

        References: H&S Sec. 3.3.8 p. 51.

Source: comp.lang.c FAQ

--
greerga@muohio.edu me@null.net | Genius may have its limitations, but stupidity
http://www.muohio.edu/~greerga | is not thus handicapped. -- Elbert Hubbard


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/08/00 PST