4

我找不到这样做的方法,但是是否有 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 来做到这一点?

4

3 回答 3

3

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

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

于 2012-10-17T21:17:25.767 回答
2

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

在 C 中强制执行强类型检查(typedefs 的类型严格性)

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

于 2012-10-17T21:34:10.830 回答
1

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

它的意思是:

typedef float distance_feet_t;
typedef float distance_meters_t;

float,distance_feet_t并且distance_meters_t是完全相同类型的不同名称。

于 2012-10-17T21:18:12.100 回答