在({...})中使用什么C ++ 11标准规则来确定表达式的类型

时间:2018-08-04 20:27:32

标签: c++ c++11 expression gcc-extensions gcc-statement-expression

我不知道这里的编译器是什么,以及为什么它可以运行c ++代码

#include <cstdio>
int main()
{
    printf( ({  // (1)
                struct some_noize_struct {
                   // there may be another code
                };
                42;
                "abc";
              }) // (2)
            );

    return 0;
}

(1)和(2)中的表达式的类型为const char *。经过一些实验,我理解了由上一部分确定的(1)-(2)-表达类型。

这是示例代码。它适用于c ++ 11及更高版本。 http://cpp.sh/5tb47

我的问题:它是如何工作的。

1 个答案:

答案 0 :(得分:3)

正如@HolyBlackCat解释的那样,您列出的代码使用了GCC编译器对C ++(和C)的扩展,同时允许将复合语句用作表达式。

在您的printf()语句中,您需要提供一个const char*const char* &表达式作为该函数的第一个参数,例如printf("hello")printf(getenv("PATH"))。该扩展允许使用大括号中的块中的最后一条语句将其解释为此类表达式。您遇到的障碍是:

{ 
    struct some_noize_struct { 42 };
    42;
    "abc";
}

具有3条语句。最后一条语句是整个表达式的值,这意味着printf()所看到的内容与您键入printf("abc")时的内容基本相同。

这种代码is not standard C++ (C++11 or any another version), nor is it standard C

我建议您编写“ C ++ Shell”网站的维护者,并要求他们显示其使用的确切编译命令行,和/或确保他们使用--std=c++11来编译C ++ 11代码-看起来好像他们没有做。