2010-06-05 26 views
5

ho bisogno di scrivere un tale definiscono in C/C++utilizzo #define in C/C++

#define scanf(fscanf(inf, 

al fine di sostituire ogni scanf( con fscanf(inf, letteraria

Ma io non so come ...

Grazie

+8

Basta dire no a tale uso di macro. –

+0

@Brian È più di curiosità che uso ... – Betamoo

+0

C o C++, e quale compilatore? –

risposta

11

si desidera utilizzare un Variadic macro.

Nel tuo caso, credo che si desidera:

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

Si noti che questo non è portatile. –

+0

Questo potrebbe funzionare. –

+0

@Brian: è nella bozza C++ 0x e supportato da GNU, Intel e Microsoft, quindi almeno su x86 lo considererei abbastanza portatile per la maggior parte degli scopi – Christoph

0

Non è possibile sostituire una parentesi. Se si utilizza Visual C++, quindi è possibile utilizzare una macro variadic per compiere ciò che si desidera:

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

altri compilatori possono avere una struttura simile, ma io non sono a conoscenza.

+0

È standard C99. §6.10.3.1 –

+0

Color me sorpreso. Grazie per il chiarimento. –

+0

C99 standard per quanto ne so. – ShinTakezou

1

impossibile il modo in cui hai provato, naturalmente.

si hanno a che fare le cose come

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

Vedi esempio here

MODIFICA: GNU cpp supporta anche macro variadiche; è VA_ARGS preceduto da doppia sottolineatura e si è conclusa con la doppia sottolineatura ... devo studiare fuggire markup qui ...

+1

Testo surround con apici inversi per creare codice inline. È il modo migliore per scrivere '__VA_ARGS__' nel mezzo di un paragrafo. ;) –

3

Basta scrivere tutto il codice utilizzando fscanf, e definire il nome del file con una macro come questa:

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

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

ho bisogno di scrivere un tale definiscono in C++

No, non lo fai. Quello che vuoi veramente è reindirizzare stdin.

freopen(inf, "r", stdin);