2017-06-22 4 views
0

Ich habe die folgende Funktion foo() und das Makro FOO(str).Makro innerhalb einer Funktion und Stringfication

void foo(const char *fmt, ...) { 
    va_list args; 
    va_start(args,fmt); 
    vsprintf(msgbuff,fmt,args); 
    va_end(args); 
    printf("%s\n",msgbuff); 
} 

#define FOO(str)\ 
foo str;   // No need of brackets as they are coming in 'str' 

habe ich das Makro wie unten zu nennen:

FOO(("My %s is %s\n","Name","Bala")); 

Jetzt ist meine Anforderung ist:

Makro FOO(str) sollte meine Funktion nicht aufrufen foo() direkt, sondern sollte es durch eine andere Funktion aufrufen wie func().

Schließlich sollte mein Makro wie sein unter

#define FOO(str)\ 
func(#str) // Do I need to Stringizing str? 

Meine Frage ist, wie kann ich Funktion aufrufen foo() von innen func()? Bitte schlagen Sie eine mögliche Implementierung vor.

+0

Klingt, als ob Sie ein variadic Makro benötigen. –

+1

Warum möchten Sie überhaupt ein Makro verwenden? Verwenden Sie niemals ein Makro, wenn eine Funktion das auch macht! Und die erste Version des Makros ist fehlleitend und verschleiert Ihren Code. – Olaf

+0

Bitte geben Sie die Definition von 'func()' an. –

Antwort

-1

Sie können variadische Makro

#define FOO(...) \ 
fun(__VA_ARGS__); 

verwenden und wie diese

FOO("A", "B", "C") 

EDIT rufen:

Wie Olaf darauf hingewiesen, ist dies nicht gefördert und kann durch eine ersetzt werden direkter Funktionsaufruf

+0

Die Frage sagt nichts über die Verwendung einer variablen Anzahl von Argumenten aus. Und selbst wenn, wie ein Makro nicht notwendig ist, daher dringend abgeraten wird. – Olaf

+0

Korrigiert, bearbeitet, um diesen Punkt zu verdeutlichen – lapinozz

+1

@lapinozz: Er hat seine Frage mit C und nicht mit C++ markiert. –