SMe*_*ers 8 c printf type-conversion void
我有一个像这样的功能
void printMe (void *i)
{
printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)
我想传递一个无效指针并将其打印到屏幕上.上面的例子很好,如果i是整数,浮点数或双精度数,但如果我是一个char则崩溃.C中没有像我通常在C++中使用的那样重载.所以问题是这样,我们可以在C中创建一个函数来打印它作为参数的元素,如果是的话,这是怎么可能的,因为它在这一刻完全无法实现.
Bin*_*ier 24
Q1:问题是,我们可以在C中创建一个函数来打印作为参数的元素
答:不是你想要的方式.您必须将信息传递给函数,告诉它您传递的数据类型.
Q2:如果是的话,这怎么可能,因为此刻它完全无法实现.
答:因为无法做到,所以无法解决.没有与void*关联的元数据,编译器或运行时可以使用它来确定它们指向的类型.你需要
因为代码是唯一可以打印的东西是我指向的地址.
void指针指向原始数据,printf假设您知道要打印的数据类型,它没有智能,无法为您"弄清楚".
就这么简单.
你可以做的是将类型信息传递给函数,但最后你会得到一些非常类似于printf的东西,你可以在其中传递一个格式化字符串,其中包含有关以下方案中数据的类型信息.
希望这可以帮助.
还有..." 在C中没有超载,就像我通常在C++中使用的那样 "
即使在c ++中,重载也发生在编译时,这里编译器无法知道将哪些数据传递给该函数,所以即使你习惯于重载,它也不会像这样工作(例如试试这个使用printf的东西,但用C++编译器编译它,你会得到完全相同的结果).其实试试
cout << i;
Run Code Online (Sandbox Code Playgroud)
在上面的函数中,它将给出我指向的地址,而不是i的"值".在你获得它的价值之前,你需要施展我并将它去除它
cout << *(int*)i;
Run Code Online (Sandbox Code Playgroud)
因此,要使用C++进行上述工作,您需要有许多重载函数(或模板函数,除了编译器为您提供函数外,它实际上是相同的),例如重载函数
printMe(int i){...}
printMe(double d){...}
printMe(char c){...}
printMe(char* string){...}
Run Code Online (Sandbox Code Playgroud)
在c中,您只需要为这些函数指定特定的名称
printInt(int i){...}
printDouble(double d){...}
printChar(char c){...}
printString(char* string){...}
Run Code Online (Sandbox Code Playgroud)
首先,您要打印指针,而不是它指向的指针.要打印实际内容,您需要传递*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 ... */
}
}
Run Code Online (Sandbox Code Playgroud)