globi statici e spazi dei nomi anonimi in C ++


11
  1. Perché il C ++ ha fatto una distinzione tra globi statici (collegamento interno) e simboli in uno spazio dei nomi senza nome (collegamento esterno, ma non è possibile fare riferimento ad esso dall'esterno), quando è stato introdotto quest'ultimo?

  2. Alcuni di questi motivi sono ancora validi o ce ne sono di nuovi?

  3. Ci sono posti in cui sono ancora diversi ma la regola arbitraria che devono essere le unioni globali anonime (o spaziali)static e quali sono?

  4. Per i punti bonus, se non ci sono buoni motivi per cui sono diversi, c'è una richiesta per renderli equivalenti?


Quando il C ++ ha introdotto gli spazi dei nomi (C ++ 98), e in particolare gli spazi dei nomi senza nome, i globi statici sono stati deprecati come obsoleti e inferiori alla nuova cosa in un attacco di entusiasmo, sebbene ciò sia stato ripristinato con C ++ 11 :
Deprecazione della parola chiave statica ... non piu?

Prima di C ++ 11, i simboli con collegamento interno non potevano essere utilizzati come argomenti modello: Perché C ++ 03 richiedeva che i parametri modello avessero un collegamento esterno?


Sembra che tu abbia principalmente risposto alla tua domanda, ad eccezione del bit "implementazione conforme"; forse dovresti considerare di rimuovere la seconda metà e pubblicarla come risposta? O c'è ancora qualcosa senza risposta qui?
Kyle Strand

@KyleStrand Riformulato tutto.
Deduplicatore,

Risposte:


3

Suppongo che questo non risponda a tutte le tue domande (o a nessuna di esse?), Ma la differenza chiave tra dichiarazioni statiche a livello di file e spazi dei nomi anonimi è che gli spazi dei nomi si applicano anche ai tipi (non puoi dichiarare un statictipo nella nello stesso senso in cui dichiari una variabile), è per questo che lo spazio dei nomi è preferito, quindi esiste un unico linguaggio per dichiarare tipi e dati con ambito file.

Esemplificativo, il seguente codice dovrebbe essere compilato correttamente. (Non molto utile, poiché non è possibile distinguere tra entrambi i tipi, ma è consentito)

#include <iostream>

struct Foobar
{
    int   foo;
    float bar;
};

namespace
{

struct Foobar
{
    double baz;
};

} // namespace

int main()
{
    std::cout << "HELLO!\n";
}

Un test dal vivo qui .


Si compila perché non usi Foobar nella funzione principale.
dshil,

Ancora più importante cosa succede se un altro file .cpp dichiara la propria versione di struct Foobar? Peggio ancora, supponiamo che sia ora class Foobar. Pensa a come intendi creare costruttori per entrambi.
dgnuff
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.