_Decimal64 在 C++ 中没有类型
_Decimal64 does not have a type in C++
我正在使用GNU将C与C++源代码混合在一起。_Decimal64
在 C 中被识别得很好,但在C++中则不然。C++抱怨error: '_Decimal64' does not name a type
.
有什么方法可以解决这个问题吗?我应该将其视为编译器错误吗?
更新 20-Mar-2017 18:19:
到目前为止,没有一个答案符合我的要求。我不想使用decimal64
C++ 类,我想使用_Decimal64
C 类型。我的项目主要是用 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代码。num
在numeric.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;
decimal
namespace
在namespace
std
源代码可以在这里找到,以供将来参考
我已经四处打听了,我想我已经解决了这个问题。在 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
为真。
唷。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型