c 到 c++,在翻译中丢失
Posted
技术标签:
【中文标题】c 到 c++,在翻译中丢失【英文标题】:c to c++, lost in translation 【发布时间】:2015-05-04 17:26:18 【问题描述】:我正在尝试将工具从 C 转换为 C++,以便可以编译为 CLR。我是一个 .NET 人,所以这远远超出了我的舒适区。
以下行出现编译错误(如果信息不足,请告诉我):
if (qvartype[ currQ ] == FLOATING )
*range *= get_scale( currQ ); /* Make range units match */
/* data units. */
currQ
是 short
。错误在get_scale
函数中定义。这个函数前面定义为:
#define get_scale( i ) ((short)pow( 10, (int)((long)(cat_names[ i ]))))
...这对我来说看起来很荒谬,深入类型转换地狱,但它确实在 C 中编译。但是,在 C++ 中,我收到以下错误消息:
Error 374 error C2668: 'pow' : ambiguous call to overloaded function
我知道 C 不使用重载的概念,但 C++ 使用,而且这个热混乱的变量签名让人不清楚要调用哪个函数。
我该如何解决这个问题?为了最大限度地兼容 C++,编写此代码的正确方法是什么?
【问题讨论】:
次要注意,get_scale
不是函数,而是宏。
重载集也可能有所不同,具体取决于您是#include <math.h>
还是#include <cmath>
或两者,您是否using namespace std;
(不推荐)并且还取决于工具链。它真的很丑陋。最简单的做法是使类型与 C pow()
函数匹配,因此始终选择 C 函数。
如果你需要计算的 10 的幂适合一个整数(看起来你正在这样做),使用静态查找表而不是调用 @ 可能会更快987654332@。无论如何我都会这样做,因为 pow
的一些实现会存在轻微的舍入误差,即使您使用的是整数。
仅推荐电影参考。
人们很想用一个简单的 long
数组替换缩放数组 cat_names
,其中包含正确的 10 次方值,只是为了移除整个可怕的结构。
【参考方案1】:
在 c++ 中,pow 函数具有以下签名
double pow (double base, double exponent);
所以如果你让你打电话给
#define get_scale( i ) ((short)pow( 10.0, (double)cat_names[ i ])))
但那是使用宏,我对这些不太满意。我会创建一个函数
short get_scale(int i)return (short)pow( 10.0, (double)cat_names[ i ]);
见http://www.cplusplus.com/reference/cmath/pow/
【讨论】:
这是签名之一。 It has many overloads 否则 OP 不会收到ambiguous call to overloaded function
错误。
当我访问 cplusplus.com 时,我很糟糕,默认情况下它在 c90 文档中,它只有 1 个签名,但你是对的。但是只更改为双打会起作用。【参考方案2】:
根据
https://msdn.microsoft.com/en-us/library/dt5dakze.aspx
有很多pow()
变体。您使用类型转换调用 pow()
,但编译器匹配的函数很少并且会混淆。
将get_scale()
的定义更改为更具体的类型,以便编译器可以明确地选择正确的pow()
版本。
【讨论】:
【参考方案3】:C++ 中没有满足您调用签名(int, int)
的 pow() 的重载版本。支持的调用约定之一是(double, int)
,因此将您的调用修改为:
pow(10.0, ...)
应该够了
【讨论】:
不应该 ` double pow (Type1 base , Type2 exponent); ` 适合 (int,int) 签名吗? @thermite:这是一个 C++11 扩展。 @JeremyHolovacs 使用浮点数执行整数运算存在舍入错误的风险,因此将这个宏替换为实际执行整数乘法的内联函数会是一种改进 @MattMcNabb 谢谢,我会把它标记为“待办事项”...第一步是让这个快乐捆绑在一起构建... 可能取决于range
指向的变量的类型是什么。以上是关于c 到 c++,在翻译中丢失的主要内容,如果未能解决你的问题,请参考以下文章
使用 C# 从 RLM 读取许可证文件(C++ 到 C# 的翻译)