Question 11.18

Cosa significa il messaggio ``warning: macro replacement within a string literal'' ?


Qualche compilatore/preprocessore pre-ANSI interpreta le definizioni di macro come

	#define TRACE(var, fmt) printf("TRACE: var = fmt\n", var)
tale che l'invocazione
	TRACE(i, %d);
sia espansa come
	printf("TRACE: i = %d\n", i);
In altre parole, i parametri dei macro sono espansi anche dentro le stringhe costanti e i caratteri costanti.

L' espansione del macro non e` definita in questo modo dal K&R o dallo Standard C. Quando si vuole trasformare gli argomenti del macro in stringhe, si puo` usare il nuovo operatore di preprocessore #, assieme alla concatenazione con stringhe costanti (un'altra nuova caratteristica ANSI):

	#define TRACE(var, fmt) \
		printf("TRACE: " #var " = " #fmt "\n", var)
Vedere anche domanda 11.17.

Riferimenti: H&S Sez. 3.3.8 p. 51


Leggere di seguito: prev prossima su cima


Questa pagina e` di Steve Summit // Copyright 1995 // mail feedback