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.


Wie versuchst du das zu nutzen?
Chris

Antworten:


142

Verwenden Sie den Präprozessor #Betreiber :

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

28

Sie möchten den Stringisierungsoperator verwenden:

#define STRING(s) #s

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

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";

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.