【问题标题】:compiler warning for cast missing on typedef variablestypedef 变量上缺少强制转换的编译器警告
【发布时间】:2012-10-17 21:13:23
【问题描述】:

我找不到这样做的方法,但是是否有 GCC/LLVM 的编译器标志,我可以在其中得到它来警告我:

typedef float distance_feet_t;
typedef float distance_meters_t;

void shouldWarnMe ( void )
{
    distance_feet_t feet = 10.0f;
    distance_meters_t meters = 20.0f;

    /* this should generate a warning */
    distance_meters_t total = meters + feet;
}

本质上,我想重新定义变量类型,这样如果我开始混合它们,编译器就会警告我缺少演员表。

我试过 -Wall: 没有警告。

有一些方法可以在不使用 typedef 的情况下解决这个问题。但是问题是,有没有一种方法可以使用所描述的 typedef 来做到这一点?

【问题讨论】:

  • 简单地说,不:typedefs 只是宏之上的一个级别,只是现有类型的别名。
  • FWIW,在带有 Boost 的 C++ 中,对于给出的特定示例,问题已由 Boost.Units 处理。
  • stackoverflow.com/questions/30931720/…可能对你有帮助(有sparse的参考)

标签: c gcc


【解决方案1】:

不。就编译器而言,distance_feet_tdistance_meters_t 是完全相同的类型。我不知道在纯 C 中执行此操作的任何方法,但是您绝对可以在 C++ 中执行此操作,方法是为每个不同的单元类型定义一个类并定义适当的重载运算符(尽管那里有很多烦人的样板文件)。

旁注:以后缀_t 结尾的全局范围内的标识符被认为是 POSIX 标准保留的;我建议避免使用此类标识符,尽管发生冲突的可能性非常低(如果发生冲突,很容易解决)。

【讨论】:

    【解决方案2】:

    没有“干净”的方法,但有一些技巧。

    Enforce strong type checking in C (type strictness for typedefs)

    我通常使用struct 技巧,如果我真的必须这样做,否则我只使用 lint。

    【讨论】:

      【解决方案3】:

      typedef 不会创建新类型,而是为现有类型创建别名。

      意思是:

      typedef float distance_feet_t;
      typedef float distance_meters_t;
      

      floatdistance_feet_tdistance_meters_t 是完全相同类型的不同名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-18
        • 1970-01-01
        • 2012-03-03
        • 2019-07-09
        • 2015-10-23
        • 2017-02-11
        • 1970-01-01
        相关资源
        最近更新 更多