Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 外部代码需要char*但I';我使用constchar*_C++ - Fatal编程技术网

C++ 外部代码需要char*但I';我使用constchar*

C++ 外部代码需要char*但I';我使用constchar*,c++,C++,我正在将一个文件映射到内存,并将const char*返回到第一个字节: Mapper(const char* path, const char*& firstByte, size_t& fileSize); 但是我使用的外部代码(我不能更改它)需要一个char*(尽管它不会更改缓冲区): 因此,我得到了一个编译器错误(将常量传递给非常量),必须将常量数组复制到非常量数组 这些文件很大,所以我不想复制它们。这里最好的解决方案是什么?重载我的映射程序以返回非常量?Const ca

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

Mapper(const char* path, const char*& firstByte, size_t& fileSize);
但是我使用的外部代码(我不能更改它)需要一个
char*
(尽管它不会更改缓冲区):

因此,我得到了一个编译器错误(将常量传递给非常量),必须将常量数组复制到非常量数组


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

如果真正的pinky promise的
externalCode
没有修改缓冲区,并且如果您无法修改缓冲区,那么我将使用
Const\u cast
编写一个包装,其中参数是固定的:

void externalCodeFixed(const char* bytes) {
    externalCode(const_cast<char*>(bytes)); // NOTE bytes are not modified
}
void externalcodefix(常量字符*字节){
externalCode(const_cast(bytes));//注意:未修改字节
}


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

这是否回答了您的问题?尽管它不会更改缓冲区——如果缓冲区永远不会被修改,请让该函数的作者更改签名。否则,如果在将来的某个版本的代码中,您的代码被破坏,您就没有追索权。作者只会对您说“参数是
char*
,您期望什么?”“小指承诺”:-)+1@TedLyngmo最具约束力的合同。是一个有趣的构造,但现在我真的想要
std::pinky\u promise
void externalCodeFixed(const char* bytes) {
    externalCode(const_cast<char*>(bytes)); // NOTE bytes are not modified
}