繁体   English   中英

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

[英]VC++ compiler and type conversion?

当我将程序从Mac移到此Windows PC时,VC ++ 2008编译器给我将unsigned int传递给cmath pow()函数的错误。 据我了解,此函数没有重载,只能接受浮点数。

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

编辑

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

关于此处的其他答案,告诉问题作者关闭此警告不是一个好主意。 他的代码已损坏-他传递的是无符号int而不是float。 您应该告诉他修复他的代码!

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

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

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

附录

没有编写过的编译器能够关闭错误。

警告表示编译器认为您在错误

错误表示编译器不知道该做什么

有两种选择:

在C语言中,解决方案就是将int转换为double:

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 <cmath>来代替#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/zh-cn/library/2c8f766e.aspx

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

对于int指数,C ++对于pow / powf具有重载。 注意警告。

不要忽略此警告或任何警告。 修复它们。 编译器是您的朋友,它试图使您编写良好的代码。 它是一个相信艰难爱情的朋友,但它是您的朋友。

如果您有未签名的int且需要浮点数,则将您的未签名的转换为浮点数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM