2011-03-13 17 views
8

msvc ha l'analogico di gcc's ({}).msvc ha l'analogico di gcc's ({})

Suppongo che la risposta sia no.
Nota che questa è una questione di capacità del compilatore, non di gusto o stile.

Non che io raccomandi a nessuno di iniziare a usare il costrutto ({}) per la domanda.

Il riferimento al costrutto ({}) è: http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC62 chiamato ufficialmente "Dichiarazioni e dichiarazioni nelle espressioni". Permette di incorporare le espressioni (come per, goto) e le dichiarazioni in espressioni.

+1

Can Chiedo un riferimento al costrutto? Grazie! – xanatos

+0

I secondi xanatos. Cosa fa/significa? – 0xC0000022L

+1

@xanatos, @STATUS_ACCESS_DENIED: consente di disporre di un blocco di istruzioni che valutano un valore. È molto utile per scrivere macro. È un'idea presa a prestito dal lisp in cui __every__ raggruppamento di affermazioni è così. – Omnifarious

risposta

4

No, non contiene un modulo equivalente.

10

In qualche modo, sì. Questo è un compound statement expression, che si potrebbe considerare come una funzione lambda che viene immediatamente chiamata e chiamata solo una volta.

versioni recenti di MSVC dovrebbero supportare funzioni lambda, in modo che sarebbe qualcosa di simile:

[](){ /* your compound statement expression here */ }(); 

EDIT: rimosso un surplus parentesi

EDIT 2: Per il vostro divertimento, ecco un esempio di come usare una variazione con un codice reale (certamente totalmente sciocco). Mi piace troppo l'utilità reale del codice, ma come espressiva è e come ben il compilatore anche ottimizza:

#include <string.h> 
#include <stdio.h> 

int main() 
{ 
    unsigned int a = 
     ({ 
      unsigned int count = 0; 
      const char* str = "a silly thing"; 
      for(unsigned int i = 0; i < strlen(str); ++i) 
       count += str[i] == 'i' ? 1 : 0; 
      count; 
     }); 

    unsigned int b = 
     [](){ 
      unsigned int count = 0; 
      const char* str = "a silly thing"; 
      for(unsigned int i = 0; i < strlen(str); ++i) 
       count += str[i] == 'i' ? 1 : 0; 
      return count; 
     }(); 

    printf("Number of 'i' : %u\t%u\n", a, b); 

    return 0; 
} 

... che gcc 4.5 compila a:

movl $2, 8(%esp) 
movl $2, 4(%esp) 
movl $LC0, (%esp) 
call _printf 
+1

Questo è un po 'distorto. – Omnifarious

+0

Ehi ... è come Javascript! Sapevo di poter sfruttare la mia conoscenza JS per programmare C++ !!! Ora ho solo bisogno di JQuery ++! :-) :-) – xanatos

+0

In realtà è piuttosto interessante, è possibile utilizzare ad esempio per inizializzare una variabile con un intero piccolo programma e, se il compilatore può dimostrare che il valore di ritorno dipende solo dalle costanti, eseguirà l'intero calcolo in fase di compilazione, oltre alla brutta sintassi ({}), è anche molto espressiva. Quel genere di cose ha funzionato molto bene con gcc per anni, solo sfortunatamente in un modo non standard. Lambda è molto superiore, perché è standard e consente di fornire parametri e ha un controllo di accesso globale. – Damon