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.             */

currQshort。错误在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++,在翻译中丢失的主要内容,如果未能解决你的问题,请参考以下文章

SDK 指针的问题 - c++ 到 Delphi 的翻译

使用 C# 从 RLM 读取许可证文件(C++ 到 C# 的翻译)

Huggingface MarianMT 翻译器会丢失内容,具体取决于模型

C++ 代码翻译成 Java

使用 Boost 库 Qt C++ 更新翻译文件

VB6 中的 C++ 代码翻译