Nitin Gupta
Nitin Gupta

Reputation: 53

use of ## and # operator to concatenate the strings in a macro in C

I am having a code which requires to concatenate strings as shown below:

#define CMD(A,B)  CMD_##A_PROMPT##B

void main()
{
    int a = 10, b = 5;
    printf("%s\n", CMD(a, b));
}

the desired output is: CMD10_PROMPT5
Can this be achieved by any means?

Upvotes: 1

Views: 268

Answers (2)

Steve Jessop
Steve Jessop

Reputation: 279245

You can do it by replacing int a = 10, b = 5; with:

#define a 10
#define b 5

Otherwise it's not possible. C translation occurs in a series of phases defined in the standard, and preprocessing phase occurs before any object definitions are parsed. As far as the preprocessor is concerned, int a = 10 does not establish any relationship between the token a and the token 10.

If all you're after is the output, do it like this:

#define CMD_PATTERN "CMD_%d_PROMPT%d"

int main() {
    int a = 10, b = 5;
    printf(CMD_PATTERN "\n", a, b);
}

There's unfortunate requirement that the arguments are supplied in the same order that they appear in the pattern - this makes it difficult to change the order in future. For that reason, it might be better to define a formatting function rather than just a pattern.

Upvotes: 1

Eitan T
Eitan T

Reputation: 32920

I don't think that this can be done, because the macro you're looking for is a compile-time "stringification", an the parameters receive their values at run-time.

If you're looking for run-time "stringification", use sprintf and the like.

Upvotes: 3

Related Questions