繁体   English   中英

初始化char-array和char与整数文字的区别

[英]Difference in initializing char-array and char with integer literals

在我的系统( 4.13.11-1-ARCH,gcc 7.2.0 )上signed char 初始化带有integer literalchar数组时,如下所示:

const char mydata[] = {
    0x80
};

我收到以下错误:

error: narrowing conversion of ‘128’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]

但是,当我改为执行const char data = 0x80 ,编译器并不担心任何缩小,尽管它当然会发生。 输出为7F ,最高正有signed char值。

为什么编译器在两种情况下都不会同样担心截断?

这实际上是应该首选{}初始化的原因之一:它不允许缩小转换。 与此相反,旧的初始化方式(如const char data = 0x80 )确实允许缩小转换。

形式为const char c = 0x80初始化程序是比初始化程序列表更旧的构造,后面已经介绍过。 因此可以为初始化程序列表定义更严格的规则,而这些规则不适用于“较旧”的初始化程序(可能是因为不会超出必要的“旧”代码)。

因此, 此在线c ++标准草案中定义的初始化列表禁止此类缩小:

8.5.1聚合

(2)当聚合由初始化列表初始化时,如[dcl.init.list]中所指定的,初始化列表的元素被视为聚合成员的初始化者,增加下标或成员顺序。 每个成员都是从相应的initializer子句复制初始化的。 如果initializer子句是一个表达式,并且转换表达式需要缩小转换([dcl.init.list]),则程序格式错误。 ...

顺便说一句:如果你使用像const char data { 0x80 }这样的大括号初始化器,你也会得到一个错误。 因此更严格的规则是由于括号初始化器/初始化器列表,而不是由于您是初始化数组还是标量值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM