0

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

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

4

1 回答 1

3

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

在您的printf()语句中,您需要提供一个const char*orconst char* &表达式作为函数的第一个参数,例如printf("hello")or printf(getenv("PATH"))。该扩展允许使用块中的最后一条语句将花括号块解释为这样的表达式。您的情况是:

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

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

这种代码不是标准 C++(C++11 或任何其他版本),也不是标准 C

我建议您编写“C++ Shell”网站的维护人员并要求他们显示他们使用的确切编译命令行,和/或确保他们用于--std=c++11编译 C++11 代码 - 看起来他们不是正在做。

于 2018-08-04T20:42:30.317 回答