Q1:所以问题是这样的,我们可以在 C 中创建一个函数来打印它的参数元素
A:不是你想要的方式。您必须将信息传递给函数,告诉它您传递的数据类型。
Q2:如果是的话,这怎么可能,因为此刻我完全无法理解。
A:它正在逃避你,因为它无法完成。没有与 void* 关联的元数据,编译器或运行时可以使用这些元数据来确定它们所指向的类型。你需要
- 传递一个包含一个
的结构
关于什么的指针和信息
指针指向(例如
枚举)。
- 传递一个额外的参数
关于指针的信息
指向
就代码而言,您可以在这里打印的唯一内容是 i 指向的地址。
空指针指向原始数据,printf 假定您知道要打印的数据类型,它没有智能并且无法为您“弄清楚”。
就这么简单。
你可以做的是将类型信息传递给函数,但你最终会得到非常类似于 printf 它本身的东西,你传递一个格式化字符串,其中包含有关以下参数中数据的类型信息。
希望这会有所帮助。
还有。 . . "C 中没有我通常在 C++ 中使用的重载"
即使在 c++ 中,重载也是在编译时发生的,编译器无法知道将哪些数据传递给该函数,因此即使您习惯于重载,它也永远不会像这样工作(例如使用 printf 尝试同样的事情,但使用 C++ 编译器编译它,你会得到完全相同的结果)。
实际试试
cout << i;
在上面的函数中,它会给你 i 指向的地址,而不是 i 的“值”。
在获得它的价值之前,您需要先转换 i 并对其加以尊重
cout << *(int*)i;
因此,要使上述内容在 C++ 中工作,您需要有很多重载函数(或模板函数,这实际上是一回事,除了编译器会为您滚动函数),例如重载函数
printMe(int i){...}
printMe(double d){...}
printMe(char c){...}
printMe(char* string){...}
在 c 中,您只需为这些函数指定特定名称
printInt(int i){...}
printDouble(double d){...}
printChar(char c){...}
printString(char* string){...}