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.