当我将程序从 Mac 移动到这台 Windows PC 时,VC++ 2008 编译器在将无符号整数传递给 cmath pow() 函数时出现错误。据我了解,该函数不会重载以接受除浮点数之外的任何内容。
是否有一些编译器标志/设置会忽略这些错误?还有谁知道如何找到VC++编译器的文档吗?
这不是警告,而是错误。然而,对我来说这不是问题,因为我的程序只处理以整数形式出现的数字,所以我不在乎它们不是浮点数。如果这只是警告,我会继续我的生活,但它不允许我编译。我可以以某种方式抑制错误吗?就像我说的,我的 Mac 上没有出现错误,程序也正常。
关于这里的其他答案,告诉问题作者关闭此警告并不是一个好主意。他的代码被破坏了——他传递的是无符号整数而不是浮点数。你应该告诉他修复他的代码!
这不是警告,而是错误。然而,对我来说这不是问题,因为我的 程序只处理以整数形式出现的数字,所以我不在乎 它们不是花车。如果这只是警告我会继续我的生活,但事实并非如此 让我编译。我可以以某种方式抑制错误吗?就像我说的,错误不是 在我的 Mac 上运行,程序运行良好。
整数和浮点数在内部使用不同的表示形式。 如果 int 和 float 中有相同的数字,则它们存储内的位模式是完全不同。 如果您在应该传递浮点数时传递了整数,那么您就不能在任何情况下期望您的代码能够工作。
此外,我断言您的 Mac 代码要么默默地使用该函数的重载版本(例如,您在该平台上使用 C++ 进行编译),要么您相信它可以工作,而实际上它是偶然工作的或实际上没有工作。
有史以来没有任何编译器能够关闭错误。
警告意味着 编译器认为您犯了错误。
错误意味着 编译器不知道要做什么。
有几个选项:
在 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++ 编写时,您应该始终更喜欢这些版本。
我不知道标志,但摆脱警告对我来说很容易。只需双击“任务列表”中的每个警告并添加适当的强制转换,无论您是否愿意
(double) my_variable
或
static_cast<double>(my_variable)
我猜如果您收到不明确的警告,则说明在某处定义了多个 pow 函数。无论如何,我认为最好明确一下。无论如何,我投票给 static_cast 选项。
正如 Mehrdad 提到的,使用
#pragma warning
语法来禁用警告。文档位于此处 - http://msdn.microsoft.com/en-us/library/2c8f766e.aspx
我倾向于修复警告而不是隐藏它们!
C++ 对
pow
指数有 powf
/int
的重载。请注意警告。
不要忽略此警告或任何警告。 修复它们。 编译器是你的朋友,试图让你写出好的代码。 这是一个相信严厉爱情的朋友,但它是你的朋友。
如果您有一个无符号整型并且需要一个浮点数,请将您的无符号整数转换为浮点数。
MSDN Library 是该语言的 VC++ 实现和 IDE 本身的文档。