What does the message ``warning: macro replacement within a string literal'' mean?
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.
References:
H&S Sec. 3.3.8 p. 51
Read sequentially: prev next up top
This page by Steve Summit // Copyright 1995 // mail feedback