相关疑难解决方法(0)

如何创建类型安全枚举?

使用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,即使对于枚举常量也可以实现完整的类型安全性?

c enums type-safety

54
推荐指数
4
解决办法
4058
查看次数

如何让gcc警告将错误的枚举传递给函数

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)

enums gcc gcc-warning

23
推荐指数
3
解决办法
7656
查看次数

C中的Typesafe枚举?

如果我有多个enum,例如:

 enum Greetings{ hello, bye, how };

 enum Testing { one, two, three };
Run Code Online (Sandbox Code Playgroud)

如何强制使用正确的enum?例如,我不希望有人hello在他们应该使用时使用它们以one获得更好的调试和可读性.

c enums

7
推荐指数
2
解决办法
2706
查看次数

枚举可以被认为是不安全的吗?

因为我知道 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 更好吗?不过,我在这里也很可能是错的。

c enums

5
推荐指数
1
解决办法
215
查看次数

分配枚举变量的值超出枚举范围是否有警告?

我有一个使用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)

是否有一个警告,我可以启用分配值超出枚举范围的枚举变量?

c gcc gcc-warning

2
推荐指数
1
解决办法
366
查看次数

标签 统计

c ×4

enums ×4

gcc ×2

gcc-warning ×2

type-safety ×1