C++11 标准的哪些规则用于确定 ({ ... }) 中表达式的类型
What rules of C++11 standard are used to determine the type of the expression in ({ ... })
我不明白编译器在这里做什么以及它为什么能运行 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)-expression。
这是一个示例代码。它适用于 c++11 及更高版本。
http://cpp.sh/5tb47
我的问题:它是如何工作的。
正如@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" 网站的维护者,让他们显示他们使用的确切编译命令行,and/or 确保他们使用 --std=c++11
来编译 C ++11 代码 - 看起来他们没有这样做。
我不明白编译器在这里做什么以及它为什么能运行 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)-expression。
这是一个示例代码。它适用于 c++11 及更高版本。 http://cpp.sh/5tb47
我的问题:它是如何工作的。
正如@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" 网站的维护者,让他们显示他们使用的确切编译命令行,and/or 确保他们使用 --std=c++11
来编译 C ++11 代码 - 看起来他们没有这样做。