【问题标题】:How to pass pointer of unknown type to function?如何将未知类型的指针传递给函数?
【发布时间】:2019-11-01 17:07:21
【问题描述】:

我想将一个变量按值传递(我使用指针只是为了避免给参数一个类型)到一个函数中,以便它可以被包含在其中的另一个函数使用。内部函数可以被赋予任何类型的变量。

我已经尝试过使用通用指针 (void*),但它告诉我“'void*' 不是指向对象的指针类型”。我不想强制转换指针,因为使用指针的全部意义在于它是通用的。

void print_string(char *string, void *variable) {
  Serial.print(string);
  Serial.print(": ");
  Serial.print(*variable); # This takes a variable of any type (int, float, double, char *);
  Serial.println();
}

我希望能够提供 int、double、float 或 string (char*)。

【问题讨论】:

  • 你不能。然而,这是 C++,而不是 C,不是吗?在 C++ 中,您可以使用函数模板。
  • 你必须投它,没有别的办法。当然,使用这样一个指针的全部意义在于它是通用的,但它对用户来说是通用的——某个地方的某个人最终必须编写允许它通用的代码。
  • @immibis:这段代码中没有任何东西阻止它成为 C(除了指向 void 的指针的明显取消引用,这也不是有效的 C++)。
  • 它是 C++(Arduino IDE,所以 C++ 有很多额外的库),但我试图只使用 C。
  • @PaulGriffiths "Serial.println" 加上我碰巧已经知道 Arduino IDE 使用 C++。

标签: c function pointers


【解决方案1】:

答案是尽管不想,但你必须施放它。您正在尝试取消引用指向某个内存位置的指针,但是当它是 void * 时,您并没有给编译器任何关于该信息大小的相似之处,因此它无法将其转换为正确的程序集访问该内存的指令。

【讨论】:

  • 有没有办法可以尝试将 void 指针转换为不同的类型并查看它是否“成功”,或者它是否会强制将指针转换为该类型?
  • @AlexStiles 您可以将其转换为 int *float *double *char * 但问题是,如果您将其转换为的大小大于指针最初指向的是什么,那么您将访问该变量之外的内存,这可能非常糟糕。我认为您正在寻找的解决方案是 C11 标准中引入的 _Generic 关键字。在此处阅读更多信息:robertgamble.net/2012/01/c11-generic-selections.html
  • 为了完整起见,重要的不仅仅是大小,还有表示。例如,int *float * 本身的大小可能都是 8 字节,并且都可能指向大小为 4 字节的对象,但是您将无法对指向的对象做任何事情-to value 除非您知道它是两种底层类型中的哪一种,因为直到您知道您无法确定这些位的含义。
猜你喜欢
  • 2018-02-06
  • 2018-02-15
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多