首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >忽视gcc/clang的“--什么--支撑”的警告是明智的吗?

忽视gcc/clang的“--什么--支撑”的警告是明智的吗?
EN

Stack Overflow用户
提问于 2012-12-16 20:31:32
回答 4查看 27.3K关注 0票数 55

考虑以下方案:

代码语言:javascript
运行
复制
#include <array>

int main()
{
  std::array<int, 1> x = { 0 }; // warning!
  x = { { 0 } }; // no warning
  return 0;
}

第一个初始化导致对gcc 4.7.2的警告.

代码语言:javascript
运行
复制
main.cpp:5:22: warning: unused variable ‘x’ [-Wunused-variable]

..。和clang 3.1

代码语言:javascript
运行
复制
main.cpp:5:28: warning: suggest braces around initialization of subobject [-Wmissing-braces]
  std::array<int, 1> x = { 0 };

就标准而言,双大括号和单花括号之间应该没有区别,至少在这个例子中是这样的。

有两种处理警告的方法:

  1. 把它关了
  2. 修复代码,所以编译器很高兴

你有什么建议?这双卷曲的表情看上去有点难看。另一方面,在更复杂的例子中,警告可能会发现真正的问题。你知道这个警告对你有帮助的例子吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-16 20:59:15

(for C++ mode), as of 4.8, for precisely the reason you describe.对于GCC的当前版本,无论是禁用还是忽略警告,您所拥有的代码都是按其应有的方式编写的。

警告可能是为了涵盖代码,例如

代码语言:javascript
运行
复制
struct A { int a; int b; };
struct B { A a; int b; };
B b = {
  1,
  2 // initialises b.a.b, not b.b
};

但是,-Wmissing-field-initializers已经很好地处理了IMHO,它不警告您的原始代码。

票数 52
EN

Stack Overflow用户

发布于 2015-03-09 07:05:39

我在Xcode 6.1.1 (截至2015年3月9日的当前版本)中得到了同样的警告。当我在每个子对象周围加上额外的大括号时,我会得到一个错误。当我在整个初始化列表周围添加一组额外的大括号时,警告就会消失。根据14882:201123.3.2.1标准规范,array.overview第2小节明确声明

代码语言:javascript
运行
复制
array<T, N> a = { initializer-list };

其中,初始化程序列表是最多N个元素的逗号分隔列表,其类型可转换为T。

Xcode 6.1.1中的代码结果(下文)

代码语言:javascript
运行
复制
array<int, 2> key1 = {1, 2}; // warning: suggest braces around initialization of subobject

array<int, 2> key2 = { {1}, {2} }; // error: no viable overload =

array<int, 2> key3 = array<int, 2> { {1}, {2} }; // error: excess elements in struct initializer

array<int, 2> key4 = { {1, 2} }; // no warning and no error

当我们查看14882:20118.5 dcl.init小节1时,我们可以看到‘初始化程序-列表’可以选择地包含‘初始化-子句’,它本身可以是‘大括号-init-列表’。所以这两种方法都应该是正确的。尽管基于规范,我个人认为单个大括号不应该输出对std::数组初始化程序列表和双大括号的编译器警告。

票数 8
EN

Stack Overflow用户

发布于 2018-01-24 02:18:13

Clang6.0取消了关于缺少大括号的警告。svn日志显示:

当聚合-用本身是聚合的单个字段初始化一个结构时,会出现警告。在C++中,这种std::数组类型的初始化按照标准保证工作,完全是惯用的,而Clang的“建议”替代方案在技术上是无效的。

因此,如果需要支持,我将省略大括号,并在6.0之前禁用-Wmissing-braces for Clang。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13905200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档