2010-06-05 12 views
5

necesito escribir un tal definen en C/C++uso de #define en C/C++

#define scanf(fscanf(inf, 

con el fin de reemplazar cada scanf( con fscanf(inf, literaria

Pero no sé cómo ...

Gracias

+8

Solo di no a dicho uso de macros. –

+0

@Brian Es más de curiosidad que de uso ... – Betamoo

+0

C o C++, ¿y qué compilador? –

Respuesta

11

que desee utilizar un Variadic macro.

En su caso, creo que quiere:

#define scanf(...) fscanf(inf,__VA_ARGS__) 
+2

Tenga en cuenta que esto no es portátil. –

+0

Esto podría funcionar. –

+0

@Brian: está en el borrador de C++ 0x y es compatible con GNU, Intel y Microsoft, por lo que al menos en x86 lo consideraría lo suficientemente portátil para la mayoría de los propósitos – Christoph

0

No se puede reemplazar un paréntesis. Si está utilizando Visual C++, entonces se puede utilizar una macro variadic para lograr lo que quieren:

#define scanf(format, ...) fscanf(inf, format, __VA_ARGS__) 

Otros compiladores pueden tener una instalación similar, pero no estoy familiarizado con ellos.

+0

Es estándar C99. §6.10.3.1 –

+0

Coloréjame sorprendido. Gracias por la aclaración. –

+0

estándar C99 hasta donde yo sé. – ShinTakezou

1

imposible de la manera en que lo intentó, por supuesto.

que tiene que hacer cosas como

#define scanf(S, ...) fscanf(inf, S, __VA_ARGS__) 

Véase, por ejemplo here

EDITAR: GNU cpp también admite macros variadic; se VA_ARGS precedida por doble guión y terminó con doble subrayado ... Tengo que estudiar escapar marcado aquí ...

+1

Texto envolvente con retrocesos para crear código en línea. Es la mejor manera de escribir '__VA_ARGS__' en medio de un párrafo. ;) –

3

Sólo tiene que escribir todo el código usando fscanf, y definir el nombre de archivo con una macro como esta:

#ifdef USE_SCANF 
#define SCANF_FILE(file) stdin 
#else 
#define SCANF_FILE(file) file 
#endif 

fscanf(SCANF_FILE(blah), "%d", &a); 
4

Tengo que escribir un tal definen en C++

no, no lo hace. Lo que realmente quieres hacer es redirigir stdin.

freopen(inf, "r", stdin);