【问题标题】:Compare size of types at compile time在编译时比较类型的大小
【发布时间】:2018-02-14 20:11:30
【问题描述】:

我正在编写一些需要 64 位浮点计算的代码,但在一些部署它的平台上没有 64 位浮点类型。
我有一个使用软件模拟 64 位类型的代码版本,但我希望能够将硬版本和软版本组合为一个单独的版本,包括硬件和软件浮点之间的开关类型定义。
float 和 double 都可用,但在一个平台上它们都是 4 字节大小,而在另一个平台上它们是 4 和 8 字节。

我知道我不能在预处理器宏中使用 sizeof(),所以我比较了两者的最大值,但在 Arduino 框架中 FLT_MAXDBL_MAX 似乎没有定义?

如何在编译时执行此检查?

【问题讨论】:

  • sizeof(TYPE) 在编译时进行评估。与它一起使用静态断言。 stackoverflow.com/questions/3385515/static-assert-in-c
  • 为什么不能在宏中使用sizeof?为什么这是一个问题?只是不要使用宏
  • 既然你标记了C++,你可以使用if constexpr,或者模板特化,或者标签调度,或者别的什么。
  • 它是什么版本?如果您使用的是 10 年前的编译器,则无论如何都应该考虑升级
  • 静态断言会导致编译失败,它不会让我退回到软浮点类型

标签: c++ arduino c-preprocessor


【解决方案1】:

这适用于 C,但也可能适用于 C++。

我们的想法是针对它们的DBL_* 兄弟测试一个或多个FLT_* 宏。如果它们相同,那么您很可能在不区分 float32 和 float64 的系统上。怎么样

#include <float.h> /* or <cfloat>?  */

#if FLT_MANT_DIG == DBL_MANT_DIG
  /* Funny system */
#else
  /* Sane system */
#endif

检查你的 float.h 内容是否合适。

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 1970-01-01
    • 2015-07-31
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多