【问题标题】:Casting const void * to const char * [closed]将 const void * 转换为 const char * [关闭]
【发布时间】:2021-11-26 21:24:14
【问题描述】:

为函数指针做一个排序函数练习,所以我正在为char*编写一个比较函数。

cmp2(const void *p, const void *q)

如何将void *p 转换为char*

我尝试了const char* cp = static_cast<const char *>(p);,但它不起作用...

我不想使用像 (const char *)p 这样的 C 风格转换或类似的东西

【问题讨论】:

  • 这能回答你的问题吗? Proper way of casting pointer types
  • reinterpret_cast 可能有用
  • 你能显示错误吗?
  • 如果是const char * 的比较函数,为什么还要使用const void *
  • void * 比 C 风格演员更 C 风格...

标签: c++


【解决方案1】:

static_cast<const char *> 应该可以正常工作!

下面的代码sn-p演示一下。

#include <iostream>

bool compare(const void *p, const void *q){
        const char * casted_p = static_cast<const char*>(p);
        const char * casted_q = static_cast<const char*>(q);
        return *casted_p == *casted_q;
}

int main(int argc, char * argv[]) {

        char c1 = '6';
        char c2 = '6';

        const char *p1, *p2;

        p1 = &c1;
        p2 = &c2;

        if(compare(p1,p2)){
                std::cout << "equal" << std::endl;
        } else {
                std::cout << "diff" << std::endl;
        }

        return 0;
}

这将打印equal

如果将一个字符更改为其他字符,例如 7,它将打印diff

我不确定这种功能的目的是什么,但可以做到!

注意:如果您要做的是类型擦除,请考虑使用模板!这是更安全、更现代的方法。为这样的目的使用void * 仍然是 C 风格。

【讨论】:

  • bool compare() 对于“进行 sort 功能练习”来说是不够的。比较函数需要返回一些东西来传达顺序。
  • 是的,但是排序是另一回事...这个问题是关于选角的!
  • OP 的问题是 OP 对真正问题的最佳猜测。对于模糊的“但它不起作用......”我们只能猜测。 AFAIK,OP的“不工作”确实是一个问题。如果 OP 发布了 minimal reproducible example,这将是一个更好的问题。
猜你喜欢
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
相关资源
最近更新 更多