将函数参数从void *转换为实际参数

时间:2011-06-22 20:23:03

标签: c++

我有一个例程,它将一个void *传递给一个结构。在里面 例程我将其转换为正确的类型,例如

SomeFunc(void* pMsg) {
  printf("Event = %d\n", static_cast<struct MyEventMsg*>(pMsg)->Event);
}

如果我访问结构的许多成员,代码看起来很漂亮 乱。我可以创建一个正确类型的新指针并分配它 cast void *,但似乎没有必要创建 一个临时变量,仅用于此目的。有什么方法可以演员 参数pMsg到正确的类型?

由于 道格

7 个答案:

答案 0 :(得分:4)

创建正确类型的指针并为其指定void *的转换是正确的方法。如果为指针选择“好”名称,它将使代码更短,更容易阅读。

你说你认为指针“不必要”。如果这是因为您认为存在与之关联的运行时成本,您可能会发现编译器将为您消除指针。

答案 1 :(得分:2)

做你问的方法是

SomeFunc(void* pMsg) {
  MyEventMsg * pM = static_cast<struct MyEventMsg*>(pMsg);
  printf("Event = %d\n", pM->Event);
  printf("Something Else = %d\n", pM->SomeOtherMember);
  ...
}

但我会推荐一些更多的C ++:

SomeFunc(MyEventMsg &Msg) {  // consider making this const
  cout << "Event = " << Msg.Event << endl;
  cout << "Something Else = " << Msg.SomeOtherMember << endl;
  ...
}

答案 2 :(得分:1)

不,事实上它应该是。静电铸造是您的最佳选择。不要担心临时。它很可能会被编译器优化掉

答案 3 :(得分:1)

跟临时一起去吧。如果你正确管理所有东西(如果甚至需要管理),它不会给你带来任何问题。我想你的temp也会更快,因为你只需要进行一次转换,而不是为结构的每个成员转换EVERYTIME。

答案 4 :(得分:1)

第一个问题是为什么函数首先采用void*。如果将其更改为指针的确切类型,则问题将完全消失。

如果你要在函数中多次使用指针(在转换为适当的类型之后),我只需创建一个给定类型的局部变量,一次转换然后使用它。至于创建这样一个变量的成本,在很多情况下编译器会优化变量(如果你怀疑,请查看生成的汇编)。

答案 5 :(得分:0)

  

但似乎没有必要为此目的创建一个临时变量

嗯,不是:就像你说的那样,你可以就地进行演员。

做出选择:每次施放(凌乱)或施放一次正确类型的变量(干净)。

答案 6 :(得分:0)

pMsg的类型更改为struct MyEventMsg *并创建第二个内联版本的方法,该方法采用void *,投射它并调用第一个。

您可以通过将其设为私有来阻止对第一种方法的调用。