2012-06-27 19 views
9

he encontrado dos cosas diferentes en dos libros bien conocidos en c, primero es "parámetros formales no son sustituidos en cadena entre comillas en la expansión de la macro" - por K página de lenguaje C & R 76expansión de macro variable en cadena entre comillas

segundo es un código,

#define PRINT(var,format) printf("variable is %format\n",var) 
PRINT(x_var,f); 

más tarde invocación macro se ampliaría como

printf("x_var is %f\n",x_var); 
  • esto es mediante la programación en ANSI C - E. Balagurusamy en la página 448.

Seguramente dos citas son una contradictoria con otra. hasta donde sé, primero es cierto y mi compilador me da el resultado. Pero el segundo libro también es conocido y popular. Quiero saber si hubo tales cosas en versiones anteriores de c o si la segunda cita es falsa.

+8

Parece que tiene que deshacerse de uno de esos libros. Dejaré que usted adivine si el que se deshace es el que incluye al inventor del lenguaje como autor o no. –

+0

Prefiero darle un poco de crédito a E.Balagurusamy, ¿tal vez la cita es incorrecta? – ugoren

+0

Podría ser un error en la edición.La diferencia de tamaño del libro puede hacer que esto sea posible: D – Banjocat

Respuesta

17

El segundo libro es incorrecto: it is easy to check que la macro no se expandirá de esa manera. Sin embargo, se puede obtener el efecto que se describen por stringizing fichas utilizando el operador de # preprocesador:

#define PRINT(var,format) printf(#var" is %"#format"\n",var) 

Ahora puede imprimir la variable de la siguiente manera:

int xyz = 123; 
PRINT(xyz, d); 

Aquí es a link to a working sample on ideone.

Tenga en cuenta la adición de las comillas dobles antes y después del '#formato', y '#' antes de 'var' y 'formato'. El operador '#' hace que el valor de la variable se convierta en una cadena entre comillas, con comillas dobles propias. Esto hace que las cadenas reemplazadas sean cuatro cadenas entrecomilladas en una fila, que el compilador de C reconoce como una solicitud para concatenar en una cadena. Por lo tanto, las cadenas: "xyz", "is%", "d" y "\ n" están concatenados en: "xyz es% d \ n"

(Tenga en cuenta que este ejemplo es diferente del ejemplo en la pregunta original en que el ejemplo de orignal tenía "variable es ..." donde la respuesta reemplazó a 'variable' con una instancia del argumento de macro 'var')

+0

Esto no funciona con algunas cadenas de formato, como '' d' para insertar comas con la configuración regional. Tuve que modificar la macro de la siguiente manera: '#define PRINT (var, format) printf (#var": "format" \ n ", var)', luego llámalo en código como 'PRINT (xyz,"% 'd ");'. Esto también me permitió espaciar el formato de varias líneas al agregar espacios antes del% char. – AaronCarson

1

El libro es correcto. Porque es el momento. Escribí un pequeño programa de prueba para verificar que (no se dan cuenta los editores de texto hasta que haya programado en ed):

#define PRINT(fmt,val) printf("val = %fmt\n", (val)) 
main() 
{ 
    int x; 
    x = 5; 
    PRINT(d, x); 
} 

compilé en un PDP-11 corriendo Unix V6. Ejecutar el programa produce esta salida:

x = 5 

Esto es aún pre K & R C. La "característica" fue eliminado en una de las iteraciones posteriores de C, y hecho oficial en ISO C90.

Cuestiones relacionadas