c ++ - Skal jeg bruge statisk i dette tilfælde

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en global unik værdi, som jeg ønsker at bruge den på tværs af i en exe og forskellige DLL'er.


For ethvert projekt, der ønsker at bruge det, kan de bare inkludere defs.h


Jeg undrede mig, hvis jeg skulle erklære det som


// defs.h
const UINT UNIQUE\_MESSAGE = 
    RegisterWindowMessage(\_T("UNIQUE\_MESSAGE-{E5476FDB-3E7E-4113-8132-1D87709BC46C}"));





ELLER


// defs.h
const static UINT UNIQUE\_MESSAGE = 
    RegisterWindowMessage(\_T("UNIQUE\_MESSAGE-{E5476FDB-3E7E-4113-8132-1D87709BC46C}"));





I øjeblikket finder jeg ikke anderledes end forbrugernes synspunkt. Er der nogen fangst bagved? Skal jeg bruge static eller ej?

Bedste reference


I C ++ er namespace niveau const implicit static (dvs. det har intern link), medmindre du skriver extern const. Så begge dine syntaks er stort set ens.


§7.1.1/6 siger,



  Objekter, der er erklæret konst og ikke udtrykkeligt erklæret eksternt, har intern tilknytning.



Så jeg foreslår dette: (med minimal overvejelse som at udelukke statisk initialiseringsordre fiasco og mange andre problemer med static og globale variabler) [14]


//in defs.h:
extern const UINT UNIQUE\_MESSAGE;

//defs.cpp
const UINT UNIQUE\_MESSAGE =  RegisterWindowMessage(\_T("whatever"));

Andre referencer 1


Hver CPP-fil, der indeholder defs.h, vil have sin egen forekomst af const i hukommelsen. Hvis du kun vil have én forekomst i hukommelsen, skal du erklære det en gang i en cpp-fil som du gjorde det:


const UINT UNIQUE\_MESSAGE = RegisterWindowMessage(\_T("UNIQUE\_MESSAGE-{E5476FDB-3E7E-4113-8132-1D87709BC46C}"));


I def.h skal du henvise const som en ekstern:


extern const UINT UNIQUE\_MESSAGE;

Andre referencer 2


Hvis eksemplet du giver er korrekt, ville jeg være bekymret for, at din headerfil genfortæller og initialiserer denne værdi for hver fil, den er inkluderet i. Hvis deklareres i mere end en fil uden navneområder, vil du ende med flere erklæringer af det samme symbol.


Endvidere, selvom dette blot var en erklæring, og implementeringen var i en separat kildefil, er der mange bemærkede problemer med statiske globaler, herunder initialiseringsrækkefølgen for ikke-lokale statiske globaler (initialiserer en global i en fil afhængig af en anden global i en separat fil initialiseres - initialiserings rækkefølge af globals i separate filer er ikke-deterministisk). En mere sanselig tilgang (forklaret af Scott Meyers i Effective C ++) kan være at bruge:



defs.h:
const UINT getUniqueMessage();

defs.c:
const UINT getUniqueMessage()
{
static UINT UNIQUE\_MESSAGE = RegisterWindowMessage(\_T("UNIQUE\_MESSAGE-{E5476FDB-3E7E-4113-8132-1D87709BC46C}")); // initialized once first time called
return UNIQUE\_MESSAGE;
}



Nu getUniqueMessage () kan kaldes overalt, herunder under initialisering af andre globals uden frygt for at bruge noget, der måske ikke initialiseres endnu.