【发布时间】: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