_Decimal64 在 C++ 中没有类型

_Decimal64 does not have a type in C++

本文关键字:类型 C++ Decimal64      更新时间:2023-10-16

我正在使用GNU将C与C++源代码混合在一起。_Decimal64在 C 中被识别得很好,但在C++中则不然。C++抱怨error: '_Decimal64' does not name a type.

有什么方法可以解决这个问题吗?我应该将其视为编译器错误吗?

更新 20-Mar-2017 18:19:

到目前为止,没有一个答案符合我的要求。我不想使用decimal64C++ 类,我想使用_Decimal64C 类型。我的项目主要是用 C 编写的,但我想慢慢引入C++代码。例如,这里是cell.h的一部分:

union vals
{
num c_n;
//double c_d;
char *c_s;
long c_l;
int c_i;
struct rng c_r;
};

它在cells.c中使用,这当然是C代码。numnumeric.h中定义:

#pragma once
#ifdef __cplusplus
#define USE_DECIMAL 0
#else
#define USE_DECIMAL 1
#endif
#if USE_DECIMAL
typedef _Decimal64 num;
#define NUM_HUNDREDTH 0.01DL
#define NUM_TEN 10.0DL
#else
typedef double num;
#define NUM_HUNDREDTH 0.01
#define NUM_TEN 10.0
#endif

请注意,我使用typedef double num在C++端获取编译。C++实际上并不num类型,但它不可避免地被包括在内,因为它需要 C 文件中的一些功能。

当然,这是假装的。num不是替身,真的是_Decimal64.我在问我怎样才能绕过这个笨蛋。

对于C++"十进制64">

使用std::decimal::decimal64

该标准说:

https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-api-4.6/a00454.html

_Decimal64既不是标准的C++也不是标准的C。它只是在TR 24732文件中提出的。

好的,gcc 至少在编译 C 源代码时支持它。C++对应的似乎是TR 24733。它定义了一个std::decimal::decimal64类。

这些定义可能是兼容的,因为我无法想象 GCC 研究员会构建 IEE2 的 754 个不同的实现十进制浮点数,但根据其他 SO post gcc 支持仍然不完整(在发布本文时,即 2012 年)。

您必须深入研究 gcc 文档才能找到更多信息,因为它目前是作为 gcc 扩展实现的。

我们在这个头文件中有它

#include <decimal/decimal>

将其用作std::decimal::decimal64 var;

decimalnamespacenamespacestd

源代码可以在这里找到,以供将来参考

我已经四处打听了,我想我已经解决了这个问题。在 C 语言中相当于_Decimal64,在 C++ 中__decfloat64

我举了一个允许 C 和 C++ 中小数互操作的示例。它可能看起来比必要的更复杂,但我想演示如何在实际项目中使用它。

以下是文件:

文件十点:

#pragma once
#ifdef __cplusplus
#include <decimal/decimal>
typedef std::decimal::decimal64::__decfloat64 Num;
#else
typedef _Decimal64 Num;
#endif
#ifdef __cplusplus
extern "C" {
#endif
Num get_num();
void print_num(Num n);
#ifdef __cplusplus
}
#endif

文件说明:

#include "dec.h"
Num get_num()
{
return 0.2DD;
}

文件 deccc.cc:

#include <decimal/decimal>
#include <iostream>
#include <iomanip> // for std::setprecision()
#include "dec.h"

void print_num(Num n)
{
std::decimal::decimal64 d64(n);
std::cout << std::setprecision(20) << std::decimal::decimal_to_float(d64) << std::endl;
// Output is 0.20000000298023223877
}
int main()
{
Num n = get_num();
print_num(n);
std::cout << ( 0.1 + 0.2 == 0.3) << std::endl; // false (0)
std::cout << ( 0.1DD + 0.2DD == 0.3DD) << std::endl; // true (1)
return 0;
}

文件生成文件:

dec : decc.o deccc.o
g++ decc.o deccc.o -o dec
decc.o : decc.c
gcc -c decc.c
deccc.o : deccc.cc
g++ -c deccc.cc
.PHONY : clean
clean :
rm -f *.o dec

您可以找到此文件作为要点。

GNU 编译器集合 6.3.1 中似乎没有任何小数的打印例程。我有自己的工作让我满意,所以我在这个阶段不会太大惊小怪。我想我看到了一个规范,其中小数点的打印指令是"D";但同样,它在已发布的版本中不可用。

GNU 提供的唯一输出例程是,如果您首先将小数转换为浮点数,如std::cout << std::setprecision(20) << std::decimal::decimal_to_float(d64) << std::endl;.您可以看到它并不理想,因为错误会在转换中蔓延。实际输出为 0.20000000298023223877。

不过,小数的内部表示似乎是正确的。如果我们问那个古老的问题:0.1 + 0.2 == 0.3,我们看到在浮点数中 exe 返回0为 false。

但是,如果我们0.1DD + 0.2DD == 0.3DD进行比较,那么exe的答案1为真。

唷。