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

And*_*rei 8 gcc visual-c++

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

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

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

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

Dam*_*mon 10

在某种程度上,是的.这是一个复合语句表达式,可以将其视为一个立即调用的lambda函数,并且只调用一次.

最新版本的MSVC应该支持lambda函数,所以这将是这样的:

[](){ /* your compound statement expression here */ }();
Run Code Online (Sandbox Code Playgroud)

编辑:删除了一个多余的括号

编辑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;
}
Run Code Online (Sandbox Code Playgroud)

... gcc 4.5编译为:

movl    $2, 8(%esp)
movl    $2, 4(%esp)
movl    $LC0, (%esp)
call    _printf
Run Code Online (Sandbox Code Playgroud)

  • lambda 的缺点是它们不能“break”或“continue”封闭循环。 (3认同)
  • @Damon:您需要能够`return` 来实现类似 Rust 的 `try()` 宏。 (2认同)

E.B*_*oît 5

不,它不包含等效形式。