typedef 变量上缺少强制转换的编译器警告

Rya*_*yan 5 c gcc

我找不到这样做的方法,但是 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;
}
Run Code Online (Sandbox Code Playgroud)

本质上,我想重新定义变量类型,这样如果我开始混合它们,那么编译器会警告我缺少强制转换。

我试过 -Wall:没有警告。

有多种方法可以在不使用 typedef 的情况下解决此问题。然而问题是,有没有办法按照描述的那样使用 typedef 来做到这一点?

Ada*_*eld 3

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

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