2011-11-27 20 views
22

Esiste un significato dietro alla visibilità delle strutture nidificate al di fuori della struttura in C ma non in C++? Non ho trovato alcun riferimento o rilevanza.Strutture nidificate in C e C++

struct a 
{ 
    struct b{ 
    }; 
}; 

int main(){ 
    struct b var; // allowed in C not in C++. 
} 
+2

In C++ si usa 'a :: b var;' –

+0

In qualche modo non ho mai capito che c'era una differenza ... – Mehrdad

+2

non era th e operator :: introdotto solo in C++ insieme alla nozione stessa di diversi ambiti? – Kos

risposta

4

perché b portata è all'interno di una, è necessario utilizzare struct a::b invece (ea differenza in C, la parola chiave struct è opzionale).

32

È valido in C perché C ha un singolo spazio dei nomi in cui sono definiti tutti i tipi non locali (cioè tipi non dichiarati nelle funzioni); non esiste un ambito di tipi che utilizzano spazi dei nomi o nidificazione.

In C++, il tipo è nidificato come membro della classe a, pertanto il suo nome deve essere qualificato con l'ambito in cui è dichiarato.

+0

@JimBalter Grazie; fisso. –

+0

Non C ha due spazi dei nomi globali separati per i nomi di tipo scalare e per le strutture o qualcosa del genere? –

+1

@KerrekSB: Sì, in un certo senso. Lo spazio dei nomi in questione qui è lo spazio dei nomi dei tag (in 'struct a {};', il tag è 'a'). –

8

Credo che la capacità di fare riferimento a strutture nidificate al di fuori della struttura sia stata rimossa in C++ per migliorare l'occultamento dei dati. Se è necessario accedere a una struttura nidificata esternamente, probabilmente non dovrebbe essere una struttura nidificata in primo luogo.

Wikipedia dice: "Sia in C che in C++ si possono definire i tipi di struct annidati, ma l'ambito viene interpretato in modo diverso (in C++, una struttura nidificata è definita solo all'interno dell'ambito/spazio dei nomi della struttura esterna)." (http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B). Non dice perché, ma almeno riconosce la differenza.

È tuttavia possibile utilizzare l'operatore di risoluzione dello spazio dei nomi per accedere alla struttura.

+2

Il * perché * sembra evitare l'inquinamento dello spazio dei nomi. Da http://www2.research.att.com/~bs/sibling_rivalry.pdf: "In C, gli ambiti di struttura che sembrano essere nidificati non lo sono, perché i nomi di struttura dichiarati all'interno sono considerati nello scope esterno. ha dimostrato di essere ingestibile in C++, dove le classi annidate erano spesso usate come dettagli di implementazione, di conseguenza, il C++ ha adottato ambiti di struttura annidati. " – UncleBens

+0

Sì, ha senso, grazie. –

+0

+1 per "probabilmente non dovrebbe essere una struttura annidata in primo luogo". – mskfisher

2

Non è possibile dichiarare nulla senza un campo di applicazione in C++ Nel tuo esempio struct B si trova all'interno della struct un compilatore non sa dove trovare struct b

è necessario utilizzare

struct a :: b var; 

In C non v'è alcuna restrizione per l'ambito, ma C++ assicura una restrizione