Dopo aver letto molte delle domande relative all'inizializzazione delle variabili statiche, non sono ancora sicuro di come si applica alle variabili const
a livello di spazio dei nomi.const variabili nel file di intestazione e fiasco di inizializzazione statica
devo tipo del seguente codice in un file di intestazioneconfig.h
generato dallo script di build:
static const std::string path1 = "/xyz/abc";
static const std::string path2 = "/etc";
Secondo quanto ho letto la parola static
non è necessario, anche deprecato qui.
La mia domanda: Il codice di cui sopra è soggetto al fiasco dell'inizializzazione statica?
Se ho quanto segue in una intestazione del filemyclass.h
:
class MyClass
{
public:
MyClass(const std::string& str) : m_str(str) {}
std::string Get() const { return m_str; }
private:
std::string m_str;
}
const MyClass myclass1("test");
sarà questo pone problemi di inizializzazione statico?
Se ho capito bene, a causa delle variabili const
con collegamento interno non ci dovrebbero essere problemi in entrambi i casi?
Edit: (a causa di dribeas risposta)
Forse devo dire che Sono interessato a casi d'uso come:
In main.cpp
:
#include <config.h>
#include <myclass.h>
std::string anotherString(path1 + myclass1.Get());
int main()
{
...
}
Un'altra domanda per quanto riguarda questo uso caso: il compilatore ottimizzerà lo path2
in questo caso?
non è vero che il 'static' può essere utilizzato solo nei file di implementazione. –
ovviamente, non esiste alcun concetto di file di implementazione in C++, proverò a cambiare il testo – Philipp
Penso che la frase che stai cercando sia "unità di traduzione" invece di file di implementazione. I valori dovrebbero essere dichiarati nelle intestazioni e definiti al massimo in una unità di traduzione. In questo caso, poiché sono costanti e hanno implicito il collegamento interno, non si ottiene un errore di simbolo definito in modo multiplo al momento del collegamento, ma si ha lo stesso simbolo definito in ogni unità di traduzione che include questa intestazione. Poiché hanno un collegamento interno, non interrompono il collegamento, ma il compilatore non può eliminare i duplicati. Una volta ho rasato 8 MB da un file eseguibile rimuovendo le definizioni di stringhe dalle intestazioni. – legalize