我找不到这样做的方法,但是是否有 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 来实现?
最佳答案
没有。就编译器而言,distance_feet_t
和 distance_meters_t
是完全相同的类型。我不知道在纯 C 中有什么方法可以做到这一点,但你绝对可以在 C++ 中通过为每个不同的单元类型定义一个类并定义适当的重载运算符来做到这一点(尽管那里有很多烦人的样板)。
旁注:全局范围内以后缀 _t
结尾的标识符被 POSIX 标准视为保留;我建议避免使用此类标识符,尽管发生冲突的可能性非常低(并且很容易修复,如果发生的话)。
关于typedef 变量上缺少强制转换的编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12943476/