调用函数时无条件地将所有unsigned char *转换为char *
unconditionally convert all unsigned char * to char * when calling a function
我继承了一些代码,其中有许多类型为"unsigned char *"的变量,然而,当我必须调用一些常见的函数,如strstr
,我必须做转换,如strstr((char*)x, "....")
。
不知道是否有编译器指令自动转换变量从unsigned char *
到char *
时调用函数。我检查了代码,它本来可以达到目的的。
如果我不手动转换,例如,下面的小代码片段将生成编译器错误
int main(int argc, char *argv[]) {
unsigned char *str = "hello world";
if (strstr(str, "wor")) {
printf("yesn");
}
return 0;
}
编译错误(命令行:g++ -std=c++11 te2a.cc
)
te2a.cc:17:15: error: invalid conversion from ‘const char*’ to ‘uchar* {aka unsigned char*}’ [-fpermissive]
te2a.cc:18:23: error: call of overloaded ‘strstr(uchar*&, const char [4])’ is ambiguous
te2a.cc:18:23: note: candidates are:
In file included from te2a.cc:1:0:
/usr/include/string.h:321:14: note: char* strstr(char*, const char*) <near match>
/usr/include/string.h:321:14: note: no known conversion for argument 1 from ‘uchar* {aka unsigned char*}’ to ‘char*’
/usr/include/string.h:323:22: note: const char* strstr(const char*, const char*) <near match>
/usr/include/string.h:323:22: note: no known conversion for argument 1 from ‘uchar* {aka unsigned char*}’ to ‘const char*’
使用这种强制转换的程序行为是未定义的。这是因为指针类型是不相关的。
更详细地说:char
可以签名或不签名,标准允许实现选择。因此,在一个系统上可能本质上是"无操作"的强制转换,在另一个系统上肯定不是"无操作"的强制转换。
同时,c++ 14之前的带符号char
可以是1的补码(-127到+127)或2的补码(-128到127)。这并没有使这种类型的指针的转换变得特别简单。
一种补救方法是将代码重构为std::string
。
unsigned char*
在逻辑上不是字符串,即使它以null结尾。编译器警告你,因为它不应该做出逻辑决定。
如果你知道它确实是一个兼容的字符串,你可以显式地强制转换它:
if (strstr((const char*)str, "wor")
这是不优雅的,你应该再想想为什么你的字符串是unsigned char*
。大多数人使用unsigned char*
只是为了将其与普通字符串区分开来,例如作为缓冲区。
也许你可以自己编写strstr的重载
strstr(unsigned char* s)
{
strstr(reinterpret_cast<char*>(s));
}
相关文章:
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 错误:从'void*'到'const uint8_t* {aka const unsigned char*}'的转换无效 [-允许]
- C++ - 从 "int" 到 "unsigned char" 的缩小转换无效
- 让 'std::vector<unsigned char>' 从 'std::string' 中窃取内存
- 无法从'unsigned short [9]'转换为'char []'
- 使用外部变量会导致"unsigned char"错误LNK2001
- CPPrestsdk (Casablanca) JSON 值到 std::vector<unsigned char>
- memcpy unsigned char to int
- 有没有办法将 vector<unsigned char> 插入 postgresql 表中,具有 bytea 属性,没有 UTF8 编码错误?
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 将数据从 vector<unsigned char> 传输到无符号 char[]
- 如何修复此 OpenCV 错误:断言失败((无符号)i < (无符号)cn) 在 cv::Vec<unsigned char,3>:::运算符 (), 文件
- 你什么时候会使用"signed char"而不是"unsigned char"?
- 错误:初始化时无法将'const unsigned char (*)[7]'转换为'const unsigned char (*)[]'
- 如何将std :: string传递到C 中的const unsigned char **
- 类型 "unsigned char *" 的参数与类型 "const char *" 的参数不兼容
- C 如何在功能调用中从char *转换为unsigned char *
- 从'byte* {aka unsigned char*}'到'dword {aka长unsigned int}'失去精度
- 'unsigned short var'与'unsigned char var [2]' C++
- C++ cast char * to unsigned char