2010-09-03 20 views
6

Mi sono imbattuto in un po 'di codice che contiene un paio di blocchi di codice, delineati con parentesi graffe {}. Non esiste alcuna riga prima che i blocchi di codice li contrassegnino come parte delle istruzioni if, delle definizioni di funzione o di qualsiasi altra cosa. Solo un blocco di codice che fluttua nel mezzo di una funzione. C'è qualche significato a questo? gcc sembra perfettamente felice di leggere il codice; Posso solo immaginare che sia un modo per consentire al codificatore originale di dividere visivamente i blocchi di funzionalità ...Significato di blocchi di codice a blocchi ricurve solitari in C

+0

http://stackoverflow.com/questions/1677778/why-enclose-blocks-of-c-code-in-curly-braces @Goathens, penso che la domanda posta nell'URL sopra risponda alla tua richiesta. –

+0

@Anil Sì, lo fa. Prometto che ho provato a trovare una domanda simile prima di postare! – user17925

risposta

11

Crea un ambito. Ci sono variabili automatiche definite all'interno dei blocchi? In tal caso, l'ambito di tali variabili è limitato al blocco. È utile per le variabili temporanee che non si vuole inquinare il resto della funzione, ed è anche utile quando si scrive C89, dove le definizioni delle variabili devono essere all'inizio di un blocco.

Così, invece di:

int main() { 
    int a = 0; 
    int b; 
    int i; 

    for (i = 1; i < 10; ++i) { 
     a += i; 
    } 

    b = a * a; 
    // do something with a and b 
} 

Si potrebbe avere:

int main() { 
    int a = 0; 
    { 
     int i; 
     for (i = 1; i < 10; ++i) { 
      a += i; 
     } 
    } 

    { 
     int b = a * a; 
     // do something with a and b 
    } 
} 

Ovviamente se si sta facendo questo, si hanno anche per chiedersi se i blocchi non sarebbe meglio come funzioni separate.

+0

+1 per esempi e alcune discussioni su * perché * qualcuno userebbe l'ambito. – Edmund

+0

Quando dici "inquinare il resto della funzione", ti riferisci alla leggibilità/manutenibilità? O vuoi dire che questa tecnica può aiutare a conservare la memoria? O qualcos'altro? –

+0

@ AndyJ0076: leggibilità/manutenibilità. Potrebbe conservare la memoria, dipende dal compilatore, ma non è quello che intendevo perché non lo fa in modo affidabile. I compilatori IIRC solitamente posizionano uno stack frame per l'intera funzione, indipendentemente dagli ambiti delle variabili in esso contenute. Se riutilizzano gli slot dello stack, è probabile che sia dovuto all'analisi della liveness del compilatore come dovuta allo scope. –

2

Se i blocchi di codice contengono dichiarazioni di variabili locali (la descrizione non è chiara su cosa c'è dentro), potrebbero trovarsi lì per limitare l'ambito di tali variabili. Cioè

int i = ...; 
// i is visible here 
{ 
    int j = ...; 
    // both i and j are visible here 
} 
// j went out of scope, only i is visible here 
9

autonomi parentesi graffe sono usate per scoping-eventuali variabili dichiarate in un blocco non sono visibili all'esterno.

+5

Questo è uno strumento molto potente in C++ quando combinato con RAII. –

0

Di solito significa che è stato scritto per dichiarare una parte variabile attraverso una funzione più grande, ma la variabile ha solo bisogno di un ambito molto limitato, o potrebbe anche aver bisogno di nascondere qualcosa. È completamente legittimo: introduce semplicemente un blocco. Il grosso problema è sempre "qual è il rientro corretto per quel codice".

Può essere utilizzato anche da pre-processori che convertono in linguaggio generato altri linguaggi C. Il materiale convertito viene spesso inserito in un blocco (e possibilmente anche nelle direttive #line).

2

Viene utilizzato per creare un ambito. Un ambito utile se utile per dichiarare variabili che possono essere utilizzate solo all'interno di questo ambito. Ad esempio, se una variabile viene dichiarata prima delle parentesi, può essere utilizzata all'interno delle parentesi successive. Al contrario, se una variabile viene dichiarata all'interno delle parentesi, può essere utilizzata solo all'interno delle parentesi graffe. Spero che questo aiuti.