VC++编译器和类型转换?

问题描述 投票:0回答:6

当我将程序从 Mac 移动到这台 Windows PC 时,VC++ 2008 编译器在将无符号整数传递给 cmath pow() 函数时出现错误。据我了解,该函数不会重载以接受除浮点数之外的任何内容。

是否有一些编译器标志/设置会忽略这些错误?还有谁知道如何找到VC++编译器的文档吗?

编辑

这不是警告,而是错误。然而,对我来说这不是问题,因为我的程序只处理以整数形式出现的数字,所以我不在乎它们不是浮点数。如果这只是警告,我会继续我的生活,但它不允许我编译。我可以以某种方式抑制错误吗?就像我说的,我的 Mac 上没有出现错误,程序也正常。

c++ visual-studio types cmath
6个回答
3
投票

关于这里的其他答案,告诉问题作者关闭此警告并不是一个好主意。他的代码被破坏了——他传递的是无符号整数而不是浮点数。你应该告诉他修复他的代码!

这不是警告,而是错误。然而,对我来说这不是问题,因为我的 程序只处理以整数形式出现的数字,所以我不在乎 它们不是花车。如果这只是警告我会继续我的生活,但事实并非如此 让我编译。我可以以某种方式抑制错误吗?就像我说的,错误不是 在我的 Mac 上运行,程序运行良好。

整数和浮点数在内部使用不同的表示形式。 如果 int 和 float 中有相同的数字,则它们存储内的位模式是完全不同。 如果您在应该传递浮点数时传递了整数,那么您就不能在任何情况下期望您的代码能够工作。

此外,我断言您的 Mac 代码要么默默地使用该函数的重载版本(例如,您在该平台上使用 C++ 进行编译),要么您相信它可以工作,而实际上它是偶然工作的或实际上没有工作。

附录

有史以来没有任何编译器能够关闭错误。

警告意味着 编译器认为您犯了错误

错误意味着 编译器不知道要做什么


1
投票

有几个选项:

在 C 中,解决方案是将整数转换为双精度:

pow((double)i, (double)j)

在 C++ 中,您可以执行相同的操作,但您应该使用 C++ 风格的强制转换:

pow(static_cast<double>(i), static_cast<double>(j))

但是更好的想法是使用 C++ 提供的重载:

std::pow(static_cast<double>(i), j);

底数仍然必须是浮点值,但指数至少可以是 int

std:: 前缀可能不是必需的(大多数编译器也使该函数在全局命名空间中可用)。

当然,要访问该函数的 C++ 版本,您必须包含 C++ 版本的标头。

所以你需要

#include <math.h>
 而不是 
#include <cmath>

C++ 使用此命名约定提供每个 C 头文件的 C++ 版本。如果 C 头文件名为

foo.h
,则 C++ 版本将为
cfoo
。当您使用 C++ 编写时,您应该始终更喜欢这些版本。


0
投票

我不知道标志,但摆脱警告对我来说很容易。只需双击“任务列表”中的每个警告并添加适当的强制转换,无论您是否愿意

(double) my_variable

static_cast<double>(my_variable)

我猜如果您收到不明确的警告,则说明在某处定义了多个 pow 函数。无论如何,我认为最好明确一下。无论如何,我投票给 static_cast 选项。


0
投票

正如 Mehrdad 提到的,使用

#pragma warning
语法来禁用警告。文档位于此处 - http://msdn.microsoft.com/en-us/library/2c8f766e.aspx

我倾向于修复警告而不是隐藏它们!


0
投票

C++ 对

pow
指数有
powf
/
int
的重载。请注意警告。


0
投票

不要忽略此警告或任何警告。 修复它们。 编译器是你的朋友,试图让你写出好的代码。 这是一个相信严厉爱情的朋友,但它是你的朋友。

如果您有一个无符号整型并且需要一个浮点数,请将您的无符号整数转换为浮点数。

MSDN Library 是该语言的 VC++ 实现和 IDE 本身的文档。

© www.soinside.com 2019 - 2024. All rights reserved.