Question 11.18

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