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
Puede Pido una referencia al constructo? ¡Gracias! – xanatos
I segundo xanatos. ¿Qué significa/significa? – 0xC0000022L
@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