当前位置:  开发笔记 > 编程语言 > 正文

在纯C中打印void类型

如何解决《在纯C中打印void类型》经验,为你挑选了2个好方法。

我有一个像这样的功能

void printMe (void *i)
{
    printf("%d", i);
}

我想传递一个无效指针并将其打印到屏幕上.上面的例子很好,如果i是整数,浮点数或双精度数,但如果我是一个char则崩溃.C中没有像我通常在C++中使用的那样重载.所以问题是这样,我们可以在C中创建一个函数来打印它作为参数的元素,如果是的话,这是怎么可能的,因为它在这一刻完全无法实现.



1> Binary Worri..:

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){...}



2> paxdiablo..:

首先,您要打印指针,而不是它指向的指针.要打印实际内容,您需要传递*iprintf,而不是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 ... */
    }
}

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有