【问题标题】:What rules of C++11 standard are used to determine the type of the expression in ({ ... })使用 C++11 标准的哪些规则来确定 ({ ... }) 中表达式的类型
【发布时间】:2018-08-04 20:27:31
【问题描述】:

我不明白编译器在这里做什么以及为什么它可以工作 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

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

【问题讨论】:

  • 这是一个GCC extension。它不适用于标准 C++。
  • 顺便说一句,这可以在标准 C++11 中创建一个 lambda 并立即调用它:printf( ([&amp;]{ struct some_noize_struct { /*... */ }; 42; return "abc"; }) );
  • @HolyBlackCat,谢谢。实际上,msvc 会在此代码上产生错误。带有 --Wpedantic 的 g++ 会产生警告:ISO C++ 禁止在表达式中使用花括号。

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


【解决方案1】:

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

在您的printf() 语句中,您需要提供const char*const char* &amp; 表达式作为函数的第一个参数,例如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 代码 - 它看起来他们没有做。

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多