webentwicklung-frage-antwort-db.com.de

konvertieren eines Variablennamens in eine Zeichenfolge in C++

Ich möchte einige Daten in eine Datei ausgeben. Angenommen, ich habe zwei Vektoren von Doppelwerten:

vector<double> data1(10);
vector<double> data2(10); 

gibt es eine einfache Möglichkeit, dies in eine Datei auszugeben, so dass die erste Zeile die Überschriften 'data1' und 'data2' enthält, gefolgt vom eigentlichen Inhalt. Die Funktion, die die Daten ausgibt, wird an verschiedene Arrays übergeben, so dass das Hardcodieren des Namens der Überschrift nicht möglich ist. Idealerweise möchte ich den Variablennamen in eine Zeichenfolge umwandeln und dann diese Zeichenfolge gefolgt vom Inhalt des Vektorarrays ausgeben. Ich bin mir jedoch nicht sicher, wie ich den Variablennamen 'data1' in eine Zeichenfolge konvertieren soll oder ob dies einfach möglich ist (ich vermute, dass dies nicht möglich ist). Wenn dies nicht möglich ist, ist eine Alternative denkbar Verwenden eines assoziativen Containers wie einer Karte oder einfach eines "Paar" -Containers.

pair<vector<double>,string> data1(10,'data1');  

Anregungen wären willkommen!

20
Wawel100

Sie können den Präprozessor "stringify" # verwenden, um das zu tun, was Sie wollen:

#include <stdio.h>

#define PRINTER(name) printer(#name, (name))

void printer(char *name, int value) {
    printf("name: %s\tvalue: %d\n", name, value);
}

int main (int argc, char* argv[]) {
    int foo = 0;
    int bar = 1;

    PRINTER(foo);
    PRINTER(bar);

    return 0;
}


name: foo   value: 0
name: bar   value: 1

(Sorry für printf, ich habe <iostream> nie verstanden. Aber das sollte reichen.)

37
sarnold

versuche dies:

#define GET_VARIABLE_NAME(Variable) (#Variable)

// in Funktionen

int var=0;    
char* var_name= GET_VARIABLE_NAME(var);
6
SaeidMo7

Sie können den Präprozessor verwenden. Es gibt ein Stringify-Token, das jedoch nur von der Quelle und nicht für eine Funktion verfügbar ist (Sie erhalten den Argumentnamen).

2
Puppy

Leicht angepasst von @sarnolds Antwort für C++:

#define DEBUG(x) std::cout << #x << " = " << x << std::endl;

Ein Beispielprogramm, das dies verwendet:

int main() {
    int foo = 1;
    DEBUG(foo);

    return 0;
}
2
thiagowfx

Ich hätte gedacht, die naheliegende Antwort wäre, dass die Funktion, die die Ausgabe ausführt, den Überschriftentext als Zeichenfolgenparameter verwendet.

1
anon

Für diesen Fall habe ich nameof () macro gemacht. Es gibt einen std :: string-Namen einer Variablen, eines Typs oder eines Mitglieds zurück. Es funktioniert wie nameof () in C #.

Zum Beispiel:

#include "nameof.h"

std::vector<double> data1(10);
std::string name = nameof(data1); // "data1"

struct Foo1
{
    struct Foo2
    {
        Foo1* foo1;
    };

    Foo1* foo1;
    Foo2 foo2;
};

name = nameof(Foo1::foo1->foo2.foo1); // "foo1"

name = nameof(123); // std::logic_error exception
0
Dmitry Bravikov

Ich hatte das gleiche problem Nach einigem Experimentieren habe ich folgende Makros erstellt, die Namen von Variablen, Feldern, Funktionen, Methoden und Typen in Zeichenfolgen konvertieren.

#define MACRO_VARIABLE_TO_STRING(Variable) (void(Variable),#Variable)

#define MACRO_FUNCTION_TO_STRING(Function) (void(&Function),#Function)

#define MACRO_METHOD_TO_STRING(ClassName,Method) (void(&ClassName::Method),#Method)

#define MACRO_TYPE_TO_STRING(Type) (void(sizeof(Type)),#Type)

Der Code verwendet einen Komma-Operator und eine Void-Konvertierung, um den Compiler zu zwingen, zu prüfen, ob eine Variable, eine Funktion usw. wirklich vorhanden ist. Das Schöne ist, dass es auch mit nicht initialisierten Variablen gut funktioniert. Ich habe es sowohl auf VC als auch auf GCC mit allen pedantischen Optionen getestet, die ich ohne Warnmeldungen herausgefunden habe.

int GetAndPrintValue(const char* VariableName)
{
   std::cout << VariableName << std::endl;
   return 10;
}

int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable));

Ich verwende solchen Code, wenn ich Parser schreibe, die Daten aus dem Eingabestream lesen, und wenn die analysierte Variable außerhalb der Grenzen liegt, wird eine Ausnahme mit dem Variablennamen ausgegeben, die meine Gültigkeitsprüfung nicht bestanden hat.

0
Timmy_A