2012-05-20 15 views
6

Un array di caratteri è definito globalmente e una struttura con lo stesso nome è definita all'interno di una funzione. Perché sizeof operator restituisce valori diversi per c & C++?restituisce valori diversi per c & C++?

char S[13]; 
void fun() 
{ 
    struct S 
    { 
     int v; 
    }; 
    int v1 = sizeof(S); 
} 

// restituisce 4 in C++ e 13 in C

+0

@OliCharlesworth: compila bene sul mio compilatore – Ashwyn

+0

@Ashwyn - il compilatore compila senza il ';' 'struct dopo S'' s dichiarazione? – birryree

+0

@OliCharlesworth: oops mi dispiace! ho dimenticato di scriverlo, in realtà ho scritto quel codice, invece di incollare copia! – Ashwyn

risposta

15

Perché in C++, il struct definito è chiamato S, mentre in C, è chiamato struct S (che è il motivo per cui si vedono spesso typedef struct usato in codice C). risultati Se si dovesse modificare il codice al seguente, si otterrebbe il previsto:

char S[13]; 
void fun() 
{ 
    typedef struct tagS 
    { 
     int v; 
    } S; 
    int v1 = sizeof(S); 
} 
+1

È una cattiva idea utilizzare nomi che iniziano con un trattino basso seguito da una lettera maiuscola, poiché tali nomi sono [riservati] (http://stackoverflow.com/questions/228783/) per l'implementazione. – fredoverflow

+0

Abbastanza giusto. Modificato leggermente (non che sia importante per l'esempio). –

10

In C, per riferirsi al tipo struct, hai bisogno di dire struct S. Pertanto, sizeof(S) fa riferimento alla matrice.

In C++, struct non è necessario. Quindi il locale S nasconde lo S globale.