static const char *var[] in header datei



  • hola leute

    wollte mir paar zeichenketten in ner header datei erstellen die ich brauche.

    static const char *var[] = { "test1","test2","test3"};
    

    da hat mir der kompiler warnungen raus

    [C++ Warnung] cgi_helper.h(11): W8058 Präcompilierter Header: Initialisierte Daten im Header kann nicht erzeugt werden
    

    wie mach ich das richtig ? steh grad maechtig auf dem schlauch

    Meep Meep



  • Hallo

    die Deklaration des Arrays gehört in die Headerdatei, die Implementation samt Initialisierung gehört ins die cpp-Datei

    bis bald
    akari



  • re

    hab ich mir auch gedacht, aber ich kriegs einfach nicht hin.

    wie muss das dann in den beiden dateien aussehen ?

    Meep Meep



  • Hallo

    // Header
    static const char *var[3];
    
    // Implementation
    const char *var[3]; = { "test1","test2","test3"};
    

    bis bald
    akari



  • re

    naja so weit war ich auch schon. aber da bekomme ich auch immer fehlermeldungen.

    [C++ Warnung] cgi_helper.h(11): W8058 Präcompilierter Header: Initialisierte Daten im Header kann nicht erzeugt werden
    [C++ Fehler] cgi_helper.cpp(3): E2238 Bezeichner 'var' mehrfach deklariert
    [C++ Fehler] cgi_helper.h(11): E2344 'var' bereits deklariert
    

    'var' gibt es ansonsten nirgendwo.

    akari schrieb:

    // Implementation

    const char *var[3]; = { "test1","test2","test3"};
    

    das erste ';' war wahrscheinlich nicht beabsichtigt oder ? ;o)

    Meep Meep



  • Hallo

    ja, das Semikolon muß da noch weg.
    Kann es sein, das du in der Header-Datei die Include-Guards vergessen hast?

    bis bald
    akari


  • Mod

    Meep Meep schrieb:

    wie mach ich das richtig ? steh grad maechtig auf dem schlauch

    - verzichte auf vorkompilierte Header, oder
    - begrenze den vorkompilierten Header auf solche Programmteile, die keine solchen initialierten Daten enthalten, oder
    - teile auf in Deklaration und Definition und verschiebe Letztere aus dem Header heraus

    Lezteres wird im Allgemeinen zu empfehlen sein. Allerdings muss dazu auf static verzichtet und statt dessen extern verwendet werden (mit static/auto/register oder ohne storage-Bezeichner ist es, außerhalb von Klassendefinitionen, immer eine Definition). Die Verwendung von static für Bezeichner im Namensraum gilt in C++ ohnehin als obsolet. Soweit dem nicht ein unfähiger Compiler im Wege steht, sind statt dessen in der Regel unbenannte namespaces zu benutzen.



  • noe, die sind vorhanden.
    hier mal die derzeitige header und cpp datei

    header:

    #ifndef cgi_helperH
    #define cgi_helperH
    
    #include <stdlib.h>
    #include <string>
    #include <vector>
    
    enum ReqMethod { get = 0, post, unknown, undef };
    
    static const char *var[3]; 
    
    inline ReqMethod GetRequestMethod(void)
    {
       ...
    }
    
    inline const char* GetRequestString(ReqMethod req)
    {
       ...
    }
    
    inline std::string GetParameter(ReqMethod req)
    {
       ...
    }
    
    class Params
    {
       public:
          std::string key;
          std::string value;
    };
    
    void ParseParams(const std::string param, std::vector<Params> &vec);
    
    #endif
    

    und die cpp

    #include "cgi_helper.h"
    
    const char *var[3] = { "test1","test2","test3"};
    
    void ParseParams(const std::string param, std::vector<Params> &vec)
    {
       ...
    }
    

    vielleicht sieht da jemand den fehler

    Meep Meep



  • Mach evtl mal das static weg. Macht imho wenig Sinn, da static auf globaler Ebene die Variable modullokal macht, und ein Header ist ja nicht zwangsläufig auf ein Modul beschränkt...


  • Mod

    Ich verweise noch mal auf meinen Beitrag weiter oben. Die Verwendung von static im Header wird in jedem Falle eine Verletzung der ODR weiter unten bewirken.



  • schon mal was von extern gehört? stellt euch mal vor ihr habt mehrere module, die alle den header includieren, was passiert? Alle haben ein eigenes array, da hilft auch ein #ifndef nicht, da muss extern her. Also im header Extern vor die Variable schreiben, und dann in der cpp Datei ohne extern anlegen, und mit werten befüllen. Das gilt für alle globalen Variablen, obwohl eigentlich auf globale variablen möglichst verzichtet werden sollte, und auch meißtens getan werden kann.



  • *brettvormkopf*

    Also static weg und extern davor, damit wär das dann geklärt :p Ist schon spät heute, was? 😉



  • re

    wie sieht es eigendlich aus wenn man folgendes macht.
    in der header:

    inline const char* GetRequestString(ReqMethod req)
    {
       static const char *ReqMethodString[] = {"GET", "POST", "UNKNOWN", "UNDEF"};
       return ReqMethodString[req];
    }
    

    was passiert da dann mit dem static array, wenn geinlined (was fuer ein tolles wort) wird ?

    Meep Meep


  • Mod

    Meep Meep schrieb:

    re

    wie sieht es eigendlich aus wenn man folgendes macht.
    in der header:

    inline const char* GetRequestString(ReqMethod req)
    {
       static const char *ReqMethodString[] = {"GET", "POST", "UNKNOWN", "UNDEF"};
       return ReqMethodString[req];
    }
    

    was passiert da dann mit dem static array, wenn geinlined (was fuer ein tolles wort) wird ?

    Meep Meep

    inline-Substitution ändert die Semantik eines Programmes nicht. Explizit (7.1.2/4):

    ISO/IEC 14882:2003 schrieb:

    A static local variable in an extern inline function always refers to the same object. A string literal in an extern inline function is the same object in different translation units.


Log in to reply