外部代码需要 char* 但我使用的是 const char*

Posted

技术标签:

【中文标题】外部代码需要 char* 但我使用的是 const char*【英文标题】:External code requires char* but I'm using const char* 【发布时间】:2020-07-22 11:40:26 【问题描述】:

我正在将文件映射到内存并将const char* 返回到第一个字节:

Mapper(const char* path, const char*& firstByte, size_t& fileSize);

但我使用的外部代码(我无法更改)需要char*(尽管它不会更改缓冲区):

void externalCode(char* bytes);

所以我遇到了编译器错误(将 const 传递给非常量)并且必须将我的 const 数组复制到非常量数组。

文件很大,所以我不想复制它们。这里最好的解决方案是什么?重载我的映射器以返回非常量?常量演员?

【问题讨论】:

这能回答你的问题吗? Is there any way to cast const class* to non const class 虽然它不会更改缓冲区) -- 如果缓冲区永远不会被修改,则让该函数的作者更改签名。否则,如果在他们的代码的某个未来版本中,您的代码被破坏,您将无法追索。作者只会对你说“参数是char*,你期待什么?” 【参考方案1】:

如果externalCode 是真实的,小指承诺,不修改缓冲区,如果你不能修改它,那么我将使用const_cast 编写一个包装器,其中参数是固定的:

void externalCodeFixed(const char* bytes) 
    externalCode(const_cast<char*>(bytes)); // NOTE bytes are not modified


如果对缓冲区现在或将来在某些情况下是否会被externalCode 修改有任何疑问 - 甚至可能暂时在函数内然后修改回来,这样您就不会注意到 - 那么您应该创建一个本地,可修改的副本,或将参数更改为指向非常量的指针。

【讨论】:

"pinky-promise" :-) +1 @TedLyngmo 最具约束力的合同。 std::promise 是一个有趣的结构,但现在我真的想要std::pinky_promise

以上是关于外部代码需要 char* 但我使用的是 const char*的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2440:“=”:无法从“const char *”转换为“char *”

freeRTOS xTimerCreate从'char *'到'const signed char *'的无效转换[-fpermissive]

`const char *` 在库 .so 文件中存储的奇怪行为

const char*、const char(&)[N] 和 std::string 的函数重载

从字符串中获取 char * 或 const char * 数据会中断 16 个字符或更长的字符串

arm linux c++编译警告:ISO C++ forbids converting a string constant to ‘char*’(需要把const char*转换成char*)(代码