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

What rules of C++11 standard are used to determine the type of the expression in ({ ... })

本文关键字:类型 表达式 标准 C++11 规则 使用      更新时间:2023-10-16

我不明白编译器在这里做什么,也不明白为什么它使用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

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

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

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

相关文章: