【发布时间】:2020-07-16 14:33:48
【问题描述】:
我的代码中有以下 typedef:
#define ROLLOVERDETECTION_OFF 0
#define ROLLOVERDETECTION_ON 1
typedef uint8_t rolloverdetection;
#define ROLLOVERDETECTED_NO 0
#define ROLLOVERDETECTED_YES 1
#define ROLLOVERDETECTED_UNKNOWN 255
typedef uint8_t rolloverdetected;
这两种类型,虽然它们具有相同的底层类型,但它们携带的信息并不相同。
实际上,如果代码中的任何人执行以下操作,我想收到警告:
rolloverdetection detection = ROLLOVERDETECTION_OFF;
// detection is set somewhere else in another function
void get_rolloverdetected(rolloverdetected *outvar)
{
*outvar = detection; // this actually would return the setting of the detection rather than the detection itself
}
我在 gcc 中找不到任何此类警告选项,我遇到了 -Wconversion,但只有在有可能丢失信息的情况下才会发出警告,而我的示例中并非如此。
有人知道我能做些什么吗?显然,当真正需要更改类型时,应该可以进行强制转换。
【问题讨论】:
-
为了这个问题,您可以为这些类型赋予更易区分的名称,例如
foo和bar -
由于 typedef 只是一个别名,如果有这个选项,我会感到惊讶。编译器只需要解析别名而不关心之后使用的名称。
-
搜索 strong typedef。它已经讨论过很多次了。但基本上,您希望将基本类型包装在
structs 中,以传达其含义并可用于确保类型安全。另外,请只返回值而不是通过参数指针设置输出。 -
所以
rolloverdetection detection只能由函数设置,不能作为语句设置。然后只导出函数,不导出变量。 -
这是 c 语言中真正的好东西之一。 typedef 没有定义类型。相反,它会创建一个别名。所以你应该改用“using”关键字,这样会更清楚。 :-) 要实现你想要的,你必须使用一个包含你的底层类型的结构来创建一个类型。