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
}