传递指向枚举的指针到指向整型输出参数的指针

4
我有类似于以下代码的东西:
void generateInt(int *result)
{
  /* chosen by fair dice roll*/
  *result = 1;
}

typedef enum colour
{
  RED,
  GREEN,
  BLUE
} COLOUR;

int main(int, char**)
{
  COLOUR col, col2;
  int i;

  generateInt(&i);
  col = (COLOUR)i;

  generateInt((int*)(&col2));

  return 0;
}

在第二次调用generateInt之后,colcol2是否都保证等于GREEN?我知道第一个版本设置col是合法的,但我不知道如果将指向枚举的指针转换为指向整数的指针,然后通过指针赋值会发生什么。
2个回答

5

这绝对不是好的做法。你没有理由认为枚举的底层类型是int,因此转换指针可能是不合适的。

为什么不直接改变函数呢?

void generateInt(COLOUR * c)
{
    *c = GREEN;
}

因为实际上,我正在加载已写入磁盘的结构。generateInt实际上是一个通用函数,它从从文件获取的数据中读取下一个(整数)字段。 - Chowlett
@Chowlett 这样的实现不具备可移植性。如果机器具有不同的 sizeof(int) 或字节顺序,该怎么办?为什么不使用一致的存储格式,并让加载函数设置枚举值的值呢? - Greg Inozemtsev

1

这应该是一个正确的方式:

void generateInt(COLOUR * c)
{
    //Roll number given here
    switch(roll_result)
    {
      case 0 :
        *c = RED;
      break;
      case 1 :
         *c = GREEN;
      break;          
      case 2 :
         *c = BLUE;
      break;
      //...
      default :
      break;
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接