5 Stimmen

Statische Strukturinitialisierung mit Tags in C++

Ich habe auf Stackoverflow nach einer Antwort gesucht, aber ich kann nichts Relevantes finden.

Ich versuche, eine statische Strukturinstanz mit Anfangswerten durch Angabe ihrer Tags zu initialisieren, aber ich erhalte einen Fehler bei der Kompilierung Zeit:

src/version.cpp:10: error: expected primary-expression before ‘.’ token

Hier ist der Code:

// h
typedef struct
{
    int lots_of_ints;
    /* ... lots of other members */
    const char *build_date;
    const char *build_version;
} infos;

Und der fehlerhafte Code:

// C

static const char *version_date = VERSION_DATE;
static const char *version_rev  = VERSION_REVISION;

static const infos s_infos =
{
   .build_date    = version_date, // why is this wrong? it works in C!
   .build_version = version_rev
};

const infos *get_info()
{
    return &s_infos;
}

Die Grundidee ist also, die Initialisierung der "anderen Mitglieder" zu umgehen und nur die relevanten build_date y build_version Werte. Das hat in C funktioniert, aber ich kann nicht herausfinden, warum es in C++ nicht funktioniert.

Irgendwelche Ideen?

éditer :

Ich weiß, dass dieser Code wie einfaches C aussieht, und das ist er auch. Das ganze Projekt ist in C++, so dass ich C++-Dateierweiterungen verwenden muss, um das Makefile-Abhängigkeitschaos zu vermeiden ( %.o: %.cpp )

7voto

NVade Punkte 278

Die Funktion, die Sie verwenden, ist eine C99-Funktion und Sie verwenden einen C++-Compiler, der sie nicht unterstützt. Denken Sie daran, dass C-Code zwar im Allgemeinen gültiger C++-Code ist, C99-Code jedoch nicht immer.

5voto

e.dan Punkte 7040

Der folgende Beispielcode definiert eine Struktur auf eine Art und Weise, die ich als eher C++-konform ansehe (keine Notwendigkeit für typedef) und verwendet einen Konstruktor, um Ihr Problem zu lösen:

#include <iostream>

#define VERSION_DATE "TODAY"
#define VERSION_REVISION "0.0.1a"

struct infos {
    int lots_of_ints;
    /* ... lots of other members */
    const char *build_date;
    const char *build_version;

    infos() : 
        build_date(VERSION_DATE), 
        build_version(VERSION_REVISION) 
    {} 
};

static const infos s_infos;

const infos *get_info()
{
    return &s_infos;
}

int main() {

    std::cout << get_info()->build_date << std::endl;
    std::cout << get_info()->build_version << std::endl;

    return 0;
}

4voto

Oliver Charlesworth Punkte 259497

Ich glaube, dies wurde als Funktion in C99 hinzugefügt, war aber nie eine Standardfunktion in C++.

Einige Compiler bieten sie jedoch wahrscheinlich als Nicht-Standard-Spracherweiterung an.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X