在调用函数时无条件地将所有unsigned char *转换为char *

时间:2015-07-29 15:44:51

标签: c++

我继承了一些代码,这些代码有很多类型" 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*’

3 个答案:

答案 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));
}