使用C中的枚举来实现类型安全是有问题的,因为它们基本上只是整数.实际上,枚举常量被定义为int标准的类型.
为了实现一点类型的安全性我用这样的指针做了一些技巧:
typedef enum
{
BLUE,
RED
} color_t;
void color_assign (color_t* var, color_t val)
{
*var = val;
}
Run Code Online (Sandbox Code Playgroud)
因为指针具有比值更严格的类型规则,所以这会阻止这样的代码:
int x;
color_assign(&x, BLUE); // compiler error
Run Code Online (Sandbox Code Playgroud)
但它不会阻止这样的代码:
color_t color;
color_assign(&color, 123); // garbage value
Run Code Online (Sandbox Code Playgroud)
这是因为枚举常量基本上只是一个int,可以隐式赋值给枚举变量.
有没有办法编写这样的函数或宏color_assign,即使对于枚举常量也可以实现完整的类型安全性?
gcc似乎没有使用以下代码生成警告.如何让它产生警告?
typedef enum
{
REG8_A,
REG8_B,
REG8_C
}REG8;
typedef enum
{
REG16_A,
REG16_B,
REG16_C
}REG16;
void function(REG8 reg8)
{
}
int main(void)
{
function(REG16_A); // Should warn about wrong enum
}
Run Code Online (Sandbox Code Playgroud) 如果我有多个enum,例如:
enum Greetings{ hello, bye, how };
enum Testing { one, two, three };
Run Code Online (Sandbox Code Playgroud)
如何强制使用正确的enum?例如,我不希望有人hello在他们应该使用时使用它们以one获得更好的调试和可读性.
因为我知道 an 的每个元素enum都有自己的整数值,所以我尝试了以下方法:
enum Foo {
Red = 0,
Blue = 1
};
int main(void) {
enum Foo bar = 2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它......有效。int我进一步观察,我认为它具有与(我在 UB 之后开始体验 UB )相同的最小和最大限制INT_MAX。那么,a 不就enum比一组#defines 更好吗?不过,我在这里也很可能是错的。
我有一个使用enumas 参数的 C 函数,如下例所示:
typedef enum
{
AB,
CD
} A;
void f(A input)
{
// do something
}
int main(void)
{
// do something
f(-10);
// do something
}
Run Code Online (Sandbox Code Playgroud)
是否有一个警告,我可以启用分配值超出枚举范围的枚举变量?