msvc是否具有gcc的模拟({})

时间:2011-03-13 18:44:52

标签: visual-c++ gcc

msvc是否具有gcc({})的模拟。

我认为答案是否定的。
请注意,这是编译器功能的问题,而不是品味或风格的问题。

不是我建议任何人开始使用({})构造的问题。

对({})构造的引用是:http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC62正式称为“表达式中的语句和声明”。它允许将语句(如for,goto)和声明嵌入到表达式中。

2 个答案:

答案 0 :(得分:10)

在某种程度上,是的。这是一个compound statement expression,人们可以将其视为一个立即调用的lambda函数,只调用一次。

MSVC的最新版本应该支持lambda函数,因此类似于:

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

编辑:删除了多余的括号

编辑2:为了您的娱乐,这里有一个例子,说明如何使用一些(实际上是完全愚蠢的)真实代码的变化。不要太在意代码的实际用处,但是它有多么富有表现力,编译器甚至可以很好地优化它:

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

... gcc 4.5编译为:

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

答案 1 :(得分:4)

不,它不包含等效表格。