我有一个功能喜欢

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

我想通过一个无效的指示器和打印到画面。上述例子是好的如果我是整数、浮动或双但崩溃,如果我是一个红点鲑。没有超载在C像我通常使用C++。因此,问题是这样的,我们可以创建一种功能在C会打印的元素,它的参数,并且如果是的怎么这是可能的,因为它完全逃避我在这个时刻。

有帮助吗?

解决方案

问题1: 因此,问题是这样的,我们可以创建一种功能在C会打印的元素,它的参数

A:不在你想要的方式。你要传递信息的功能,告诉它类型的数据传递。

问题2: 如果是这怎么可能的,因为它完全逃避我在这个时刻。

A:它躲避你,因为它不能这样做。没有相关的元数据与void*编译器或运行时可以使用图找出他们的类型它的指示。你需要

  1. 通过一个结构,其中包含一个
    指针和相关信息
    指针指向(例如一个 enum).
  2. 通过一个额外的参与 关于什么的指针 点到

作为代码代表的只有一件事你可以打印在这里的地址我点。

一个无效的指针指向原始数据,printf假设你知道什么,数据的类型你打印,它没有情报和无法"它"你。

就这么简单。

你可以做的是通过类型信息的功能,但后来最终你的东西非常喜欢printf这是自我,在哪里你通过一的格式包含类型字符串的信息有关的数据在下列arguements.

希望这会有所帮助。

还。.."没有超载在C像我通常使用C++"

即使在c++的重载,情况发生在汇编时间和这里有没有办法编译器可以知道哪些数据将传递到这一职能,所以即使你是用来负载过重,它绝不会这样工作(例如试试这个同样的事情使用printf,但汇编这用C++编译器,你会得到完全相同的结果)。实际上试试

cout << i;

在功能上,它会给你地址我要点,而不是"价值"。你会需要投我和derference这之前你可以得到它的价值

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

其他提示

一开始,你打印的指针,不是它指向。要打印的实际内容,你需要传递*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 ... */
    }
}
  

所以现在的问题是这样的,我们可以创建一个在C函数,将打印是它的参数

元素

是,我们能。这样的功能已经是标准库的一部分 - 它被称为printf;)

由于没有编译时功能用C重载,你以某种方式具有在运行时提供的参数的类型。该printf格式字符串可以用来做这个,所以实在没有理由来构建自己的包装功能时,已经有一个工作的解决方案。

如果你想打印出指针值,正确的用法是printf("%p", i);。在“D”说明符为整数,并且“P”为指针。这是你的责任就是让这些正确的,如果你混淆了不好的事情都可能发生。

我不知道为什么会失败的一个char *,而不是一个int *,这是可能的,你已经得到了造成这种其他问题。如果仍然失败,%P,别的东西弄乱。看看你是否可以安装某种类型的内存监控软件来检查悬摆指针或双免费()S,因为在这一点上聪明的钱是你在什么地方破坏内存。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top