我有一个像这样的功能
void printMe (void *i) { printf("%d", i); }
我想传递一个无效指针并将其打印到屏幕上.上面的例子很好,如果i是整数,浮点数或双精度数,但如果我是一个char则崩溃.C中没有像我通常在C++中使用的那样重载.所以问题是这样,我们可以在C中创建一个函数来打印它作为参数的元素,如果是的话,这是怎么可能的,因为它在这一刻完全无法实现.
Q1:问题是,我们可以在C中创建一个函数来打印作为参数的元素
答:不是你想要的方式.您必须将信息传递给函数,告诉它您传递的数据类型.
Q2:如果是的话,这怎么可能,因为此刻它完全无法实现.
答:因为无法做到,所以无法解决.没有与void*关联的元数据,编译器或运行时可以使用它来确定它们指向的类型.你需要
传递一个包含
指针的结构和有关指针指向的信息
(例如枚举).
传递一个额外的参数,其中包含指针所指向的信息
因为代码是唯一可以打印的东西是我指向的地址.
void指针指向原始数据,printf假设您知道要打印的数据类型,它没有智能,无法为您"弄清楚".
就这么简单.
你可以做的是将类型信息传递给函数,但最后你会得到一些非常类似于printf的东西,你可以在其中传递一个格式化字符串,其中包含有关以下方案中数据的类型信息.
希望这可以帮助.
还有..." 在C中没有超载,就像我通常在C++中使用的那样 "
即使在c ++中,重载也发生在编译时,这里编译器无法知道将哪些数据传递给该函数,所以即使你习惯于重载,它也不会像这样工作(例如试试这个使用printf的东西,但用C++编译器编译它,你会得到完全相同的结果).其实试试
cout << 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){...}
首先,您要打印指针,而不是它指向的指针.要打印实际内容,您需要传递*i
给printf
,而不是i
.
如果你真的想这样做,一个解决方案是:
void printMe (void *p, int typ) { switch(typ) { case TYP_INT: printf("%d", *((int*)p)); break; case TYP_CHR: printf("%c", *((char*)p)); break; /* and so on ... */ } }