当前位置: 首页 > 知识库问答 >
问题:

不一致的警告"从'const无符号字符'到'const浮点数'的转换需要缩小转换"

訾高飞
2023-03-14

Visual C 2017和gcc 5.4生成从“const unsigned char”到“const float”的转换需要对以下代码段中的B行发出缩小转换警告,但对a行则不发出警告:

#include <iostream>

int main() {
    const unsigned char p = 13;
    const float         q = p;  // Line A

    std::cout << q << '\n';

    const unsigned char c[3] = {0, 1, 255};
    const float         f[3] = {c[2], c[0], c[1]};  // Line B

    for (auto x:f)
        std::cout << x << '\n';
}

此警告是否有效?为什么B线的处理方式与A线不同?

共有1个答案

贝滨海
2023-03-14

警告是有效的,从C 11缩小转换在聚合初始化中被禁止;但不应用于复制初始化(和以前一样)。

如果初始值设定项子句是表达式,则根据复制初始化<code>允许隐式转换,除非它们正在缩小(如在列表初始化中)(从C 11开始)。</code>

在C11之前,聚合初始化中允许缩小转换,但不再允许。

list初始化通过禁止以下内容来限制允许的隐式转换:

  • 从整数类型转换为浮点类型,除非源是常量表达式,其值可以精确存储在目标类型中

顺便说一句:c[0]c[1]c[2]不是常量表达式;您可以将数组声明为,即无符号字符c[3]={0,1,255};。然后应用异常,B行也可以正常工作。

 类似资料:
  • 问题内容: 我试图将const char *传递给从Swift中的Swift字符串转换而来的旧C库。 这是我正在调用的C函数: 如何将Swift字符串转换为这种const char类型?当我像这样传递ipAddress时,它可以工作: 但是当我这样通过时dit不起作用 我在需要指定类型的函数中需要它: 我尝试使用AnyObject而不是String,但这也不起作用。 谢谢。 问题答案: 不知道为什

  • 我在尝试编写一个Arduino程序来读取通过串行连接处理发送的命令时遇到了一个小问题。处理应该通过串行连接向Arduino发送“H”或“L”。这个值在我的程序中以字符的形式存储,但当我尝试进行串行操作时。写入(“值:%c,val)”时,出现“从'const char*'到'const uint8_t*'的无效转换”错误。如果有人能帮我解决这个问题,那就太好了。我真的需要弄清楚这个值是什么,这样我才

  • 我试图使用std::cout打印一组对,但它没有编译。我在Xcode9上使用C++14。错误发生在行 错误:二进制表达式(“ostream”(又名“basic_ostream”)和“const value_type”(又名“const std::__1::pair”)的操作数无效)

  • 我想创建一个简单的3x3矩阵类,并能够通过下标操作符访问其内容。代码如下: 我希望能够访问数组的元素,无论矩阵的对象是常量还是非常量。但我从编译器中得到以下错误: 错误:从“const int*”到“int*”的转换无效[-fpermissive] 我做了一些研究,我有一个假设:也许,因为我已经将这个成员函数声明为const函数,在它的定义中,编译器将对象的所有不可变成员视为const成员(它掩盖

  • 我在编译代码时遇到了问题。 我从http://www.cplusplus.com/reference/algorithm/all_of/?kw=all_of.拿了密码 我正在使用代码::块12.11,我有以下错误: C:\用户\PC-HP\桌面\chiffre\romain\main.cpp||在实例化的'boolall_of(InputIterator,InputIterator,UnaryPr

  • 我在写JNI。在这种情况下,我的Java程序使用ByteOutputStream()获取一个图像字节数组,然后用这个数组调用C中的一个函数,将字节数组转换为无符号char*。代码如下: 在这一点上,当我编译时,我不断收到警告: 警告:使用“jbyte *”类型的表达式(也称为“signed char *”)初始化“unsigned char *”会在指向具有不同符号[-Wpointer-sign]