0

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

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

编辑

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

4

6 回答 6

3

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

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

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

此外,我断言您的 Mac 代码要么默默地使用该函数的重载版本(例如,您在使用 C++ 编译的那个平台上),要么您认为它实际上是偶然工作或实际上不工作时工作。

附录

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

警告意味着编译器认为你犯了一个错误

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

于 2009-04-16T21:23:57.480 回答
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++ 编写代码时,您应该始终喜欢这些版本。

于 2009-04-16T21:52:22.983 回答
0

我不知道标志,但摆脱警告对我来说很容易。只需双击“任务列表”中的每个警告并添加适当的演员表,无论您喜欢

(double) my_variable

或者

static_cast<double>(my_variable)

我猜如果您收到模棱两可的警告,那么在某处定义了多个 pow 函数。无论如何,我认为最好是明确的。对于它的价值,我的投票选择了 static_cast 选项。

于 2009-04-16T21:04:20.040 回答
0

正如 Mehrdad 提到的,使用#pragma warning语法来禁用警告。文档在这里 - http://msdn.microsoft.com/en-us/library/2c8f766e.aspx

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

于 2009-04-16T21:09:51.853 回答
0

C++对指数有pow/的重载。注意警告。powfint

于 2009-04-16T21:28:39.763 回答
0

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

如果您有一个 unsigned int 并且需要一个浮点数,请将您的 unsigned in 转换为浮点数。

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

于 2009-04-16T21:39:31.610 回答