【发布时间】:2023-04-03 17:57:02
【问题描述】:
整个代码都是用 ANSI C 编写的,并且应该保持不变。 我有一个这样定义的回调:
typedef enum {
Event_One,
Event_Two,
Event_State
} EventEnum;
typedef void (*callback)(EventEnum event, void* data);
回调接收者根据event 值解释data。这是组件之间的合同。有时它是指向结构的指针,有时它可能是一个字符串,其他情况可能是其他数据。我正在定义一个额外的event 并设置一个新的“合同”,data 是一个枚举。像这样:
typedef enum {
State_Initial = 0,
State_Running,
State_Final
} StateEnum;
然后在代码的某个地方我有一个回调函数,它正在这样做
void ProcessEvent (EventEnum event, void* data)
{
if (event == Event_State)
{
StateEnum state = (StateEnum)data; /* <<<<<<<<<<< */
switch (state) {
case State_Initial:
<...>
break;
case State_Running:
<...>
break;
case State_Final:
<...>
break;
}
}
}
上面的回调是这样调用的:
{
callback infoCallback = ProcessEvent; /* This is only for example,
done during initialization */
<...>
StateEnum someState = State_Running;
<...>
infoCallback(Event_State, (void*)someState); /* <<<<<<<<<<<<<<<<<<< */
}
将void* 类型转换为StateEnum 有什么根本错误吗?反之亦然?这种方式有哪些可能的陷阱?对可测试性和可维护性有什么想法吗?
编辑: 代码现在可以编译、链接和运行。我想知道为什么不应该这样做,以及是否有任何必须更改代码的真正原因。
【问题讨论】:
-
我不认为这样做有什么问题。它类似于通过采用 void* 的函数传递 int,而枚举在 C/C++ 中实际上是整数。我能看到的唯一问题是过多地使用 void* 使得代码难以扩展,因为它可以是任何东西(当它只有 10 种可能性时,仍然可以管理,但如果它有 100 种呢?)。
-
@YeenFei:将整数转换为指针是实现定义的,这意味着它不可移植。
标签: c type-conversion