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

时间:2009-04-16 20:58:22

标签: c++ visual-studio compiler-construction types cmath

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

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

修改

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

6 个答案:

答案 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本身的文档。