我想按值传递一个变量(我使用指针只是为了避免给参数指定类型)到一个函数中,以便它可以被其中包含的另一个函数使用。内部函数可以被赋予任何类型的变量。
我已经尝试过使用通用指针(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*)。
答案是,尽管你不愿意,但你必须施放它。您试图取消引用指向某个内存位置的指针,但是当该信息为
void *
时,您没有向编译器提供任何有关该信息大小的信息,因此它无法将其转换为正确的程序集访问该内存的指令。
你必须知道类型,你可以这样做:
enum DataType{
TYPE_FLOAT,
TYPE_U32,
TYPE_I32,
}
void print_string(char *string, void *variable, DataType type) {
Serial.print(string);
Serial.print(": ");
switch(type) {
case TYPE_I32:
Serial.print(*(int32_t *)variable);
break;
case TYPE_U32:
Serial.print(*(uint32_t *)variable);
break;
}
Serial.println();
}
uint32_t data = 1234;
print_string("hello", &data, TYPE_U32);