2010-06-05 25 views
5

Ich muss schreiben eine solche in C definieren/C++#define Verwendung in C/C++

#define scanf(fscanf(inf, 

um jede scanf( mit fscanf(inf, literarischen

Aber ich, wie nicht wissen, zu ersetzen ...

Dank

+8

Sagen Sie einfach Nein zu einer solchen Verwendung von Makros. –

+0

@Brian Es ist mehr Neugier als Verwendung ... – Betamoo

+0

C oder C++, und welcher Compiler? –

Antwort

11

Sie wollen einen Variadic macro verwenden.

In Ihrem Fall, ich glaube, Sie wollen:

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

Beachten Sie, dass dies nicht tragbar ist. –

+0

Dies könnte funktionieren. –

+0

@Brian: es ist in der C++ 0x-Entwurf und unterstützt von GNU, Intel und Microsoft, so zumindest auf x86 würde ich es für die meisten Zwecke tragbar genug halten – Christoph

0

Sie nicht eine Klammer ersetzen können. Wenn Sie Visual C++ verwenden, dann können Sie ein variadische Makro verwenden, um zu erreichen, was Sie wollen:

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

Andere Compiler können eine ähnliche Einrichtung haben, aber ich bin nicht mit ihnen vertraut.

+0

Es ist Standard C99. §6.10.3.1 –

+0

Färben Sie mich überrascht. Danke für die Klarstellung. –

+0

C99 Standard soweit ich weiß. – ShinTakezou

1

nicht möglich, wie Sie natürlich versucht haben.

müssen Sie Dinge wie

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

Siehe z here

EDIT: GNU cpp unterstützt variadic Makros auch; es wird VA_ARGS durch doppelte Unterstrich und endete mit Doppelstrich ... Ich habe Markup zu studieren hier zu entkommen ...

+1

Umgeben Sie Text mit Backticks, um Inline-Code zu erstellen. Es ist der beste Weg, '__VA_ARGS__' in der Mitte eines Absatzes zu schreiben. ;) –

3

einfach alle Ihren Code schreiben fscanf verwenden und mit einem Makro wie folgt aus den Dateinamen definieren:

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

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

ich brauche ein schreiben so definieren, in C++

Nein, Sie nicht. Was Sie wirklich tun möchten, ist Umleitung stdin.

freopen(inf, "r", stdin);