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

时间:2012-10-17 21:13:23

标签: 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;
}

本质上我想重新定义变量类型,如果我开始混合它们,那么编译器会警告我错过了一个演员。

我试过 - 墙:没有警告。

有些方法可以在不使用typedef的情况下解决此问题。但问题是,有没有一种方法可以使用所描述的typedef来完成它?

3 个答案:

答案 0 :(得分:3)

不。就编译器而言,distance_feet_tdistance_meters_t是完全相同的类型。我不知道在纯C中有什么方法可以做到这一点,但是你可以在C ++中通过为每个不同的单元类型定义一个类并定义适当的重载操作符来完成它(尽管那里有很多讨厌的样板)。 / p>

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

这意味着:

typedef float distance_feet_t;
typedef float distance_meters_t;

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