【问题标题】:What Does ({}); Mean in C++?做什么 ({});在 C++ 中是什么意思?
【发布时间】:2017-09-12 03:06:41
【问题描述】:

AFAIK {} 定义了一个新范围,那么它定义了什么?

({});

编译器很好地编译了这个程序:

#include <iostream>
#include <string>

int main()
{
  std::string name;
  std::cout << "What is your name? ";
  {
     ({}); 
  }
  getline (std::cin, name);
  std::cout << "Hello, " << name << "!\n";
}

当我用(); 替换({}); 时,编译器无法编译程序。

为什么({}); 运行良好,而(); 却不行?

我已经在 cpp.sh 上测试过这个程序。它编译得很好。

【问题讨论】:

  • 对我来说看起来像是一个编译器扩展。带有 -pednatic-errors 的 GCC 表示 error: ISO C++ forbids braced-groups within expressions [-Wpedantic]。
  • @HolyBlackCat 我已经在cpp.sh 上测试了该程序。它编译得很好
  • GCC 默认启用了一些非标准扩展。 -pedantic-errors 禁用它们。 -pedantic(或-Wpedantic)使 GCC 在使用时生成警告。 Cpp.sh 有一个复选框来启用第二个。
  • 具体来说,它是 GCC 中的“语句表达式”扩展——你可以谷歌一下。
  • “AFAIK {} 定义了一个新的范围”这是一个错误的陈述,至少有三种不同的上下文使用了花括号

标签: c++ c++11 scope


【解决方案1】:

({}); 不是标准 C++ 的一部分。正如@HolyBlackCat 所说,这是编译器扩展。使用-pedantic-errors 禁用编译器扩展。

在g++上编译时查看现场演示here

在vc++ 上编译时查看现场演示here 。

【讨论】:

  • 因此在这方面,VC 比 GCC 标准更符合标准。嗯,这是第一次。
  • @GillBates:为什么是第一个?有关默认启用的 GCC 编译器扩展的更常见示例,请参阅可变长度数组。遗憾的是,GCC 和 VC 都需要被明确告知要符合 ISO 标准(或尽可能地符合标准)。您不能只运行 g++ program.cpp 或 cl.exe program.cpp 并期望编译器正常运行。
  • @Christian - 至少对于 Microsoft,默认设置一直是“编译尽可能多的代码,这样客户就不会致电产品支持”。成本效益分析。 :-)
  • @BoPersson:那么应对策略应该是每次编译不合规代码时都调用产品支持:)
  • @Bo Persson 实际上他们主要支持自己的自己的代码库,这就是为什么 MS 狂热地支持一些 C 特性,例如在 C++ 中考虑 UB。或者为什么它支持开放式结构(以未定义大小数组结尾的结构)——因为 Windows 的整个内部 API 都是建立在这些结构上的。 PS.(OT) 人们是否在这里竞争他们的昵称有多有趣/聪明(而且我的名字不是在编程语言之后,我几个月前就知道了)?
猜你喜欢
  • 2011-12-11
  • 2011-12-27
  • 2013-10-31
  • 2016-01-22
  • 2020-12-19
  • 2013-05-08
  • 1970-01-01
相关资源
最近更新 更多