带指针的开关盒

发布于 2024-10-08 20:42:47 字数 474 浏览 1 评论 0原文

可能的重复:
为什么不打开指针?

int main(int argc, char** argv)
{
  void* not_a_pointer = 42;
  switch(not_a_pointer)
  {
    case 42:
      break;
  }

  return 0;
}

error: switch quantity not an integer

如何可移植地使用 switch-case 来获取指针类型变量的值?原因是我正在使用的 API 中的回调函数之一具有 void* 参数。

Possible Duplicate:
Why no switch on pointers?

int main(int argc, char** argv)
{
  void* not_a_pointer = 42;
  switch(not_a_pointer)
  {
    case 42:
      break;
  }

  return 0;
}

.

error: switch quantity not an integer

How can I portably use a switch-case for the value of a variable with a pointer type? The reason for this is that one of the callback functions in an API I'm using has a void* argument.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

烦人精 2024-10-15 20:42:47

尝试转换为 intptr_t,这是一个整数类型:

switch((intptr_t)not_a_pointer)

等等...

try casting to intptr_t, which is an integer type:

switch((intptr_t)not_a_pointer)

etc...

鸢与 2024-10-15 20:42:47

如果您知道 void* 并不是真正的指针,请在尝试在 case 语句中使用它之前将其强制转换回 int

If you know that the void* isn't really a pointer, cast it back to an int before trying to use it in the case statement.

灼疼热情 2024-10-15 20:42:47

这应该有效:

int main(int argc, char** argv)
{
  void* not_a_pointer = 42;
  switch((int)not_a_pointer)
  {
    case 42:
      break;
  }

  return 0;
}

This should work:

int main(int argc, char** argv)
{
  void* not_a_pointer = 42;
  switch((int)not_a_pointer)
  {
    case 42:
      break;
  }

  return 0;
}
拥抱影子 2024-10-15 20:42:47

如果您想要将整数传递给传递 void * 的回调 API,目的是传递该整数的地址。请注意,这可能意味着您需要进行动态分配:

int *foo = malloc(sizeof *foo);
*foo = 42;
register_callback(cbfunc, foo);

然后在回调中:(

void cbfunc(void *arg)
{
    int *n = arg;

    switch (*n) {
        case 42:
    }

    free(arg);
}

可以将整数强制转换为void *并返回,但转换是实现-定义的 void *intptr_t / uintptr_tvoid * 往返需要保留值,但无论如何,反之则不然。)

If you want to pass an integer to a callback API that passes a void *, the intention is that you pass the address of the integer. Note that this might mean you need to do dynamic allocation:

int *foo = malloc(sizeof *foo);
*foo = 42;
register_callback(cbfunc, foo);

Then in the callback:

void cbfunc(void *arg)
{
    int *n = arg;

    switch (*n) {
        case 42:
    }

    free(arg);
}

(You can coerce an integer into a void * and back, but the conversions are implementation-defined. The void * to intptr_t / uintptr_t to void * round-trip is required to be value preserving, but the inverse is not. It's ugly, anyway.).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文