2011-03-13 11 views
8

Tiene msvc análogo de gcc's ({}).does msvc have analog of gcc's ({})

Supongo que la respuesta es no.
Plase, tenga en cuenta que esta es una cuestión de capacidades de compilación, no de gusto o estilo.

No es que recomiendo a nadie que empiece a usar el constructo ({}) por la pregunta.

La referencia a ({}) constructo es: http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC62 oficialmente llamado "Declaraciones y declaraciones en expresiones". Permite incrustar sentencias (como para, goto) y declaraciones en expresiones.

+1

Puede Pido una referencia al constructo? ¡Gracias! – xanatos

+0

I segundo xanatos. ¿Qué significa/significa? – 0xC0000022L

+1

@xanatos, @STATUS_ACCESS_DENIED: Le permite tener un bloque de declaraciones que evalúan un valor. Es muy útil para escribir macros. Es una idea tomada de lisp en la que __ todas las agrupaciones de declaraciones son así. – Omnifarious

Respuesta

4

No, no contiene un formulario equivalente.

10

De alguna manera, sí. Este es un compound statement expression, que uno podría considerar como una función lambda que se llama inmediatamente, y solo se llama una vez.

Las versiones recientes de MSVC deben apoyar las funciones lambda, por lo que sería algo así como:

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

EDIT: eliminado un paréntesis excedente

EDIT 2: Para su diversión, aquí está un ejemplo de cómo para usar cualquier variación con algún código real (ciertamente totalmente tonto). No importa demasiado la utilidad real del código, pero ¿cómo expresiva que es y lo bien que el compilador incluso lo optimiza:

#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; 
} 

... lo que gcc 4.5 compila a:

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

Eso es un poco retorcido. – Omnifarious

+0

¡Oye ... es como Javascript! ¡Sabía que podía aprovechar mi conocimiento de JS para programar C++! ¡Ahora solo necesitaré JQuery ++! :-) :-) – xanatos

+0

En realidad es bastante genial, puedes usar eso, por ejemplo, para inicializar una variable con un pequeño programa completo, y si el compilador puede probar que el valor de retorno solo depende de las constantes, hará todo el cálculo en tiempo de compilación, y aparte de la sintaxis fea ({}), también es muy expresivo. Ese tipo de cosas ha estado funcionando súper bien con gcc por años, desafortunadamente de una manera muy poco estándar. Lambda es mucho mejor, porque es estándar y le permite suministrar parámetros y tiene control de acceso global. – Damon