Wie verwende ich das Makro-Argument als String-Literal?

88

Ich versuche herauszufinden, wie man ein Makro schreibt, das sowohl eine Zeichenfolgenliteraldarstellung eines Variablennamens als auch die Variable selbst an eine Funktion übergibt.

Zum Beispiel die folgende Funktion gegeben.

void do_something(string name, int val)
{
   cout << name << ": " << val << endl;
}

Ich möchte ein Makro schreiben, damit ich dies tun kann:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

Welches würde ausdrucken: my_val: 5

Ich habe Folgendes versucht:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);

Wie Sie vielleicht erraten haben, wird die VAR in den Anführungszeichen jedoch nicht ersetzt, sondern nur als Zeichenfolgenliteral "VAR" übergeben. Ich würde gerne wissen, ob es eine Möglichkeit gibt, das Makroargument selbst in ein String-Literal umzuwandeln.

Ian
quelle
Wie versuchst du das zu nutzen?
Chris

Antworten:

142

Verwenden Sie den Präprozessor #Betreiber :

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR);
Morwenn
quelle
28

Sie möchten den Stringisierungsoperator verwenden:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}
chris
quelle
9

Vielleicht versuchen Sie diese Lösung:

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";
Zili
quelle
Wie beantwortet dies die Frage oder wie ist es hilfreich?
Jirigracik
1
@jirigracik - Es ermöglicht, im Gegensatz zu anderen Antworten auch String-Präsentation der Makro-Erweiterung zu erhalten
grepcake
3
Ich denke, es wäre nützlich zu erklären, warum es QUDI(x)nicht genug ist , einfach zu haben.
LRDPRDX
8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian
Mikele Shtembari
quelle
Ich bin mir nicht ganz sicher, aber es sieht so aus, als würde "Hello" #x"(und #x "Hello") die Schnur ohne Leerzeichen zusammengeklebt, was in einigen Fällen erwünscht ist. Dies ist also eine ziemlich gute Antwort.
Smar
1
@Smar Stellen Sie sicher, dass Sie ein Leerzeichen nach der konstanten Zeichenfolge setzen Hallo: "Hello " #x
Jack
Okay, ich dachte schon, du solltest das auch zu deiner Antwort bearbeiten, da es eine wertvolle Information ist :)
Smar