我继承了一些代码,这些代码有很多类型" 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("yes\n");
}
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*’
答案 0 :(得分:0)
使用此类演员的程序行为未定义。这是因为指针类型不相关。
更详细:char
可以是签名或未签名,标准允许实现选择。因此,在一个系统上实际上可能基本上是“无操作”的投射肯定不是另一个系统上的“无操作”投射。
此外,签名的char
pre-C ++ 14可以是1的补码(-127到+127)或2的补码(-128到127)。这并不会使这种类型的指针转换特别微不足道。
一种解决方法是将代码重构为std::string
。
答案 1 :(得分:0)
unsigned char*
逻辑上不是字符串,即使它是null终止的。编译器警告你,因为它不应做出逻辑决定。
如果你知道它确实是一个兼容的字符串,你可以明确地转换它:
if (strstr((const char*)str, "wor")
它不优雅,你应该再想一想为什么你的字符串是unsigned char*
。大多数人使用unsigned char*
只是为了区别于通常的字符串,例如作为缓冲区。
答案 2 :(得分:0)
也许你可以编写自己的strstr重载
strstr(unsigned char* s)
{
strstr(reinterpret_cast<char*>(s));
}