make C ++将unsigned char *视为char *

时间:2015-11-06 20:18:29

标签: c++

我继承了许多对x.append(p, len)的调用的c ++源文件,其中x是字符串类型。但是,在许多情况下,p是“unsigned char *”类型,它在我的g ++上引起了很多错误(版本4.8.4)。如果我手动将p更改为(char*)p,则会有效。但是有太多这样的例子(可怜我!)。

想知道是否有办法告诉g ++只需将unsigned char*视为char *

感谢。

更新1

以下代码段在使用命令行g++ -std=c++11 -fpermissive te1.cc进行编译时会出错。但是,当变量len的类型从int更改为size_t时,它实际上会编译(很好但有警告)。不幸的是我无法更改参数的类型,想知道是否有办法告诉编译器在搜索size_t方法的版本时将第二个参数视为append()

//content of te1.cc
#include <iostream>

typedef unsigned char uchar;
using namespace std;
string x = "hi ";

int main(int argc, char *argv[]) {
    uchar *p = (uchar *)"tom";
    int len = 3;
    x.append(p, (size_t)len);
    cout << x << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

编辑:

扩展c ++ string类可能不是一个好主意(see that question)。

我不知道您的代码在哪些上下文中使用了append方法,但您可以尝试使用您喜欢的编辑器和简单的正则表达式添加类型转换:

查找模式:

append\(([^,\)]+),([^\)]*)\);

替换模式:

append((char *)($1),$2);

请参阅我制作的small example

答案 1 :(得分:0)

好悲伤! 不要黑客这样的东西!

如果您确实必须更改char的默认签名,请使用正确的GCC命令行选项:

  • -funsigned-char
  • -fsigned-char

但是,最好简单地修改代码以在声明时使用正确的类型,并处理(少数)奇怪的位置。