最近我在C中遇到了以下代码:
typedef enum { AAA, BBB } enumtype;
enumtype var;
void func(uint8_t* par);
..
func(&(uint8_t)var);
对我来说,这是一个废话,因为我们将临时变量的地址(转换的结果)作为参数传递给函数。但令我惊讶的是,编译器没有抱怨。重要的是,根据编译选项将枚举存储为一个字节,因此在强制转换后面没有隐藏任何实际操作。当我将uint8_t更改为uint16_t时,编译器 - 如预期的那样 - 由于非l值的地址而引发了错误。
typedef enum { AAA, BBB } enumtype;
enumtype var;
void func(uint16_t* par);
..
func(&(uint16_t)var);
现在的问题是:如果变量的基础类型和它的类型的基础类型相同,编译器是否允许(根据C标准)跳过转换?