2012-07-16 7 views
8

In GNUC C, è possibile utilizzare typeof(expression) ed è legale utilizzare un'espressione con effetti secondari all'interno. Così, per esempio si può avere questo codice C:Effetti secondari all'interno di un'espressione typeof()

int x = 0; 
typeof(x++) y; 

In questo caso, l'effetto collaterale è ignorato e x è ancora a zero dopo (questo ha un senso come tipi sono un tempo di compilazione-unica cosa).

Tuttavia, il GCC documentation dice:

L'operando di typeof viene valutata per i suoi effetti collaterali se e solo se è un'espressione di tipo variabile modificata o il nome di un tale tipo.

Cosa significa questa frase? È davvero possibile scrivere typeof con un effetto collaterale e avere l'effetto collaterale effettivamente eseguito in fase di runtime? Per me, questa frase sembra indicare questo.

+0

http://stackoverflow.com/q/4436889/195488 –

+1

@ 0A0D Questa domanda parla anche di 'typeof', ma non menziona gli effetti collaterali, ma solo le espressioni senza effetti collaterali. –

+0

@PhilippWendler: Ottima domanda! – pje

risposta

9

Sì, in alcuni casi è possibile valutare gli effetti collaterali all'interno di typeof. Come dice la documentazione, deve essere all'interno di un "tipo variabilmente modificato". Questo è un tipo che dipende da alcuni valori di runtime, ad esempio int[x].

Così il seguente codice è legale, dichiara y essere di tipo int[1], e x ha il valore 1 seguito:

int x = 0; 
typeof(int[++x]) y; 

Naturalmente, tipi ugualmente modificati variabile in generale, questo è solo legale per dichiarazioni variabili locali (funzione interna).

+3

Si noti che questo è lo stesso di 'sizeof': l'espressione operando non viene valutata tranne se viene visualizzata una matrice di lunghezza variabile e il valore della dimensione della matrice influisce sul risultato dell'espressione' sizeof'. – ouah