【问题标题】:C++ "lossy coversion" warning for member function return value成员函数返回值的 C++“有损覆盖”警告
【发布时间】:2019-12-17 00:06:12
【问题描述】:

C++ 编译器(gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-23.0.1) (GCC))在将 long long 转换为 int 时不会发出预期的警告(参见下面的代码示例)。

// compiler: gcc version 4.4.7 20120313 (Red Hat 4.4.7-23.0.1) (GCC)
// compiled with flags -pedantic -Wextra -Wshadow -Wall -Wconversion -std=gnu++0x

#include <stdio.h>

class AConv {
    public:
    long long z() {
        return 7634843234L;
    }
    void p() {
        const int v = z(); // NO WARNING. WHY ? See next line which calls the same function.
        const int w = this->z(); // compiler warning: conversion to 'int' from 'long long int' may alter its value
        printf( "v=%d, w=%d\n", v, w); // butchered values shown
    }
};

我发现这种行为违反直觉。
它是 g++ 的唯一功能吗?
我想强制编译器为两个调用生成警告,而不仅仅是第二个:

v = z();
w = this->z();

我无法升级编译器(我在有限制的公司环境中工作)。

【问题讨论】:

  • 您的编译器已经使用了七年多。用更新的版本检查一下。
  • 现在你不会找到对 GCC 4.4 的太多支持。您在使用 Red Hat 系统吗?他们因提供古董软件而臭名昭著。是否可以使用 Fedora 31 或 Ubuntu 18?他们提供现代编译器。此外,您应该使用 std 流而不是 printf 和 C++。
  • Fwiw printf 是一个可变参数函数,并不关心你传递了什么。如果你告诉它它是一个 int,而不是你得到未定义的行为。

标签: c++ compiler-warnings data-conversion


【解决方案1】:

在 GCC 世界中,-Wall 不足以收到此类警告。需要-Wconversion

编辑:
https://wandbox.org/ 的一些测试告诉我 GCC 4.4.7 不提供此警告。提供它的第一个版本是 4.7.3。

【讨论】:

  • 我正在使用 -Wconversion(参见源代码开头的 cmets):// 使用标志编译 -p​​edantic -Wextra -Wshadow -Wall -Wconversion -std=gnu++0x跨度>
  • 感谢您的 GCC 发布建议。我用 GCC 4.8.4 编译了 sn-p,编译器会为两个有问题的行适当地生成转换警告。
【解决方案2】:

你需要很长的后缀'LL'。您刚刚指定了 long(较小的类型)

return 7634843234LL;

【讨论】:

  • 我认为问题在于分配给int,而不是来自p() 的返回值。
  • ...我希望编译器对这个问题大喊大叫,但事实并非如此
猜你喜欢
  • 2012-02-16
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多