globals statici e namespace anonimi in C ++

8
  1. Perché C ++ ha fatto distinzione tra globals statici (linkage interno) e simboli in uno spazio dei nomi senza nome (linkage esterno, ma non c'è modo di riferirsi da esso all'esterno comunque), quando si introduce quest'ultimo?

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

  3. Ci sono ancora posti dove sono ancora diversi ma la regola arbitraria che i sindacati globali anonimi (o namespace) devono essere static , e cosa sono?

  4. Per i punti bonus, se non ci sono buone ragioni per farli essere diversi, c'è una richiesta per renderli equivalenti?

Quando C ++ ha introdotto spazi dei nomi (C ++ 98), e in particolare spazi dei nomi senza nome, i globals statici sono stati deprecati come obsoleti e inferiori alla nuova cosa in un momento di entusiasmo, sebbene fosse ripristinato con C ++ 11 :
Deprecazione della parola chiave statica ... non più?

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

    
posta Deduplicator 12.09.2015 - 02:59
fonte

1 risposta

3

Non suppongo che questo risponda a tutte le tue domande (o a nessuna di esse?), ma la differenza chiave tra le dichiarazioni statiche a livello di file e gli spazi dei nomi anonimi è che gli spazi dei nomi si applicano anche ai tipi (non puoi dichiarare un static digita nello stesso senso in cui dichiari una variabile), è per questo che lo spazio dei nomi è preferito, quindi c'è un solo idioma per dichiarare dati e tipi di dati con scope.

Esemplificando, il seguente codice dovrebbe essere compilato bene. (Non molto utile, dal momento che 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 live qui .

    
risposta data 14.09.2015 - 04:04
fonte

Leggi altre domande sui tag