58

Can you do something like this with a macro in C?

#define SUPERMACRO(X,Y) #define X Y then SUPERMACRO(A,B) expands to #define A B 

I have a feeling not because the preprocessor only does one pass.

Official gcc only. No third-party tools please.

6 Answers 6

42

Macros can't expand into preprocessing directives. From C99 6.10.3.4/3 "Rescanning and further replacement":

The resulting completely macro-replaced preprocessing token sequence is not processed as a preprocessing directive even if it resembles one,

Sign up to request clarification or add additional context in comments.

Comments

20

You cannot define macros in other macros, but you can call a macro from your macro, which can get you essentially the same results.

#define B(x) do {printf("%d", (x)) }while(0) #define A(x) B(x) 

so, A(y) is expanded to do {printf("%d", (y)) }while(0)

Comments

4

No. The order of operations is such that all preprocessor directives are recognized before any macro expansion is done; thus, if a macro expands into something that looks like a preprocessor directive, it won't be recognized as such, but will rather be interpreted as (erroneous) C source text.

Comments

3

Sorry, you cannot. You can call other macros in macros but not define new ones.

2 Comments

how about if you did 2 passes of the pre processor
The syntax is not valid. # is kind of a reserved character in macros. # must be followed by a macro parameter to be valid. This will 'stringify' the parameter.
1

You could try running it through with only the preprocess option, then compiling with the preprocessed file.

Comments

-2

You might do this though: #define SUPERMACRO(X,Y) define X Y

Then you can use your editors macro-expansion functionality and paste in the missing #.

Or even better: Use a different, more powerful string-processing language as your preprocessor.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.