当我将程序从Mac移动到此Windows PC时,VC ++ 2008编译器给出了将无符号整数传递给cmath pow()函数的错误。据我所知,除了浮点数之外,这个函数不会被重载以接受任何东西。
是否有一些编译器标志/设置会忽略这些错误?还有谁知道如何在VC ++编译器上找到文档?
这不是警告,而是错误。但是,对我来说这不是问题,因为我的程序只处理以整数形式出现的数字,所以我不在乎它们不是浮点数。如果它只是警告我会继续我的生活,但它不会让我编译。我可以以某种方式抑制错误吗?就像我说的那样,我的Mac上没有出现错误,程序也没问题。
答案 0 :(得分:3)
关于此处的其他答案,告诉问题作者关闭此警告不是一个好主意。他的代码坏了 - 他传递的是unsigned int而不是float。你应该告诉他修改他的代码!
这不是警告,这是一个错误。但是,对我来说,这不是问题,因为我的 程序只处理以整数形式出现的数字,所以我不在乎 它们不是漂浮物。如果只是警告我会继续我的生活,但事实并非如此 让我编译。我可以以某种方式抑制错误吗?就像我说的,错误不是 来到我的Mac上,程序很好。
整数和浮点数在内部使用不同的表示形式。如果int和float中的数字相同,则存储中的位模式完全不同。如果在传递浮点数时传递整数,那么在任何情况下都不能期望你的代码能够工作。
此外,我断言您的Mac代码是静默使用该函数的重载版本(例如,您在该平台上使用C ++进行编译),或者您认为它实际上可以正常工作或者实际上没有工作。
没有编写任何编译器能够关闭错误。
警告意味着编译器认为您犯了错误。
错误意味着编译器不知道该做什么。
答案 1 :(得分: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);
基数仍然必须是浮点值,但指数至少可以是
std ::前缀可能不是必需的(大多数编译器也在全局命名空间中使用该函数)。
当然,要访问函数的C ++版本,您必须包含标头的C ++版本。
因此,您需要#include <math.h>
#include <cmath>
C ++使用此命名约定提供每个C头的C ++版本。如果C头被称为foo.h
,则C ++版本将为cfoo
。当你用C ++编写时,你应该总是喜欢这些版本。
答案 2 :(得分:0)
我不知道旗帜,但摆脱警告对我来说很容易。只需双击“任务列表”中的每个警告,并添加适当的投射,无论您喜欢
(double) my_variable
或
static_cast<double>(my_variable)
我猜你是否得到了模棱两可的警告,在某处定义了多个战俘功能。无论如何,最好在我看来是明确的。对于它的价值,我的投票与static_cast选项一致。
答案 3 :(得分:0)
正如Mehrdad所提到的,使用#pragma warning
语法来禁用警告。文档在这里 - http://msdn.microsoft.com/en-us/library/2c8f766e.aspx
我会倾向于修复警告而不是隐藏它们!
答案 4 :(得分:0)
对于pow
个指数,C ++有powf
/ int
的重载。注意警告。
答案 5 :(得分:0)
请勿忽略此警告或任何警告。修复它们。编译器是你的朋友,试图让你编写好的代码。这是一个相信强烈爱情的朋友,但这是你的朋友。
如果你有一个unsigned int并且需要一个float,那么将unsigned in转换为float。
MSDN Library是该语言的VC ++实现和IDE本身的文档。