2015-11-06 3 views
1

Я наследую исходные файлы C++ с большим количеством вызовов до x.append(p, len), где x имеет тип строки. Однако во многих случаях p имеет тип «unsigned char *», что вызвало множество ошибок на моем g ++ (версия 4.8.4). Если я вручную изменю p на (char*)p, он будет работать. Но таких случаев слишком много (бедных!).make C++ treat unsigned char * as char *

Чудо, если есть способ рассказать g ++, просто обработайте unsigned char* как char *.

Спасибо.

UPDATE 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; 
} 
+1

Возможно, переопределение 'unsigned' может помочь, но это действительно плохое решение. На всякий случай. –

+2

Я попытался бы механически заменить 'unsigned char' на' char' в источниках. –

+0

Замена 'unsigned char' на' char' может изменить семантику кода, например.когда есть несколько отливок: ' int main() { char a = (char) 0b11111111; неподписанный символ * c1 = (unsigned char *) & a; char * c2 = & a; int i1 = * c1; int i2 = * c2; cout << i1 << "" << i2 << endl; возвращение 0; } ' – Radek

ответ

1

EDIT:

Расширение C++ string класс, вероятно, не является хорошей идеей (see that question).

Я не знаю, в каком контексте в коде используется метод append, но Вы можете попробовать добавить приведений типов, используя ваш любимый редактор и простое регулярное выражение:

поиск шаблона:

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

Заменить шаблон:

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

Смотрите small example я сделал.

+0

«опция командной строки» -Wno-pointer-sign действительна для C/ObjC, но не для C++ » –

+0

Вы правы, я пропустил это. Спасибо за ваш комментарий, похоже, мне нужно найти другое решение ... – Radek

+0

Спасибо, ребята, что искали. Желаем, чтобы в G ++ появился волшебный вариант (очень полезно в некоторых случаях). – packetie

0

Хорошее горе! Не надо взломать такие вещи!

Если вы действительно должны изменить знаковость по умолчанию char, используйте правильный вариант GCC командной строки:

  • -funsigned-char
  • -fsigned-char

Однако, было бы лучше просто исправьте код, чтобы использовать правильный тип при объявлении, и иметь дело с (несколькими) нечетными пятнами, где что-то ломается.

+0

К сожалению, они предназначены для кода gcc (c code), а не кода C++. Thx в любом случае. – packetie

+0

Что? Эти ключи предназначены для компилятора, как кода C, так и C++. –

+0

Здесь различие между C и C++ появляется. C используйте имя функции, чтобы идентифицировать фактическую функцию для ссылки, C++ будет использовать как имя функции, так и тип параметра. Я просто надеюсь, что есть переключатель, чтобы сказать компилятору C++, что он не может найти соответствующую функцию, просто обрабатывайте uchar * как char * при поиске этой функции. – packetie