2016-04-18 11 views
2

Könnten wir ein MACRO implementieren, um den Namen für Ausdrucke zu registrieren? wie unten:Können wir den MACRO-Namen als spezifische Zeichenfolge definieren?

1.C

O_PRINT_NAME_REGISTER(NET_TRACE) 
O_PRINT_NAME_REGISTER(MAIN_TRACE) 

void example(void) 
{ 
    NET_TRACE(" net log"); // LINE 20 
    MAIN_TRACE(" main log"); // LINE 21 
} 

Erwartete Ausgabe

Beispiel - 20: Netto-log
Beispiel - 21: Hauptlog

Wie definieren O_PRINT_NAME_REGISTER()?

+0

NET_TRACE/MAIN_TRACE sind voraussichtlich ein MACRO NAME. –

+0

Ich glaube nicht, dass Sie das tun können. Um die Zeilennummer zu kennen, muss NET_TRACE ein Makro sein, aber ein Makro kann kein Makro erstellen. –

+0

Ihre Anforderung scheint mir verwirrend. Willst du ein Makro, das Trace und Zeilennummer drucken könnte? – Pushpendra

Antwort

0

Es ist nicht möglich, ein Makro aus einem anderen Makro zu definieren. Von C99 6.10.3.4/3 „Neuscannen und weiterem Ersatz“:

Die resultierende vollständig Makro ersetzt Token-Sequenz Vorverarbeitung nicht als Vorverarbeitung Richtlinie verarbeitet, auch wenn es ein,

ähnelt Es ist möglich, eine Funktion mit Makro vorzubereiten, aber dann würden Sie nicht erhalten Sie die Zeilennummer und Funktionsname Informationen.

Zum Beispiel:

#define O_PRINT_NAME_REGISTER(FN_NAME) static void FN_NAME(char *arg) { \ 
              printf("%s\n", arg);   \ 
             } 

ideone link


Sie können stattdessen ein Makro definieren, das Makro wie NET_TRACE als Argument nimmt und übergibt Funktionsnamen und die Zeilennummer Information an die entsprechende Funktion oder ein Pass geeigneter Protokollierungsfunktionszeiger auf eine generische Funktion, die Informationen über den Funktionsnamen und die Zeilennummer verarbeiten kann.

+2

Ich denke, das wäre eine perfekte Gelegenheit, Funktionszeiger zu verwenden. – RastaJedi

+0

@ RastaJedi, wie? Könnten Sie helfen, die Details zur Verfügung zu stellen? –

Verwandte Themen