2015-09-03 5 views
1

У меня есть эти две строки в моем коде:Отключить предупреждение «осуждается преобразование из строки постоянной в„символ *“[-Wwrite-строки]»

RFM2G_STATUS result; 
result = RFM2gOpen("\\\\.\\rfm2g1", &rH); 

я получаю сообщение об ошибке:

"warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] 
    result = RFM2gOpen("\\\\.\\rfm2g1", &rH);" 

на самом деле я не могу изменить его

const RFM2G_STATUS result; 

потому RFM2G_STATUS предопределен в другом файле и не принимает const до. Есть ли другой способ отключить это предупреждение?

+1

Укажите, что такое подпись 'RFM2gOpen()'. –

+0

Это определение этой функции в другом файле STDRFM2GCALL RFM2gOpen (char * DevicePath, RFM2GHANDLE * rh); –

+0

Предполагая gcc, см. [Как избавиться от 'устаревшего преобразования из константы строки в 'char *' 'предупреждения в GCC?] (Http://stackoverflow.com/q/59670/1708801) –

ответ

1

Вы, кажется, абсолютно уверены, что RFM2gOpen не изменяет входную строку, иначе у вас было бы неопределенное поведение в вашем коде, как сейчас.

Если вы уверены, что входные данные не будут записаны, вы можете const_cast константность прочь безопасно:

result = RFM2gOpen(const_cast<char*>("\\\\.\\rfm2g1"), &rH); 

Опять же, это только безопасно, если процедура делает не запись на вход строка, когда-либо, иначе это неопределенное поведение!

Если вы не совсем уверены, что этот метод никогда не будет писать в массив символов, скопируйте строку в std::vector<char> и передать .data() указатель на функцию (или использовать простой char массив в качестве Bo Persson suggests, что, скорее всего, более эффективный/соответствующий, чем vector).

+0

спасибо, это действительно работало для меня –

1

Одним из возможных решений является:

RFM2gOpen(const_cast<char*>("\\.\rfm2g1"), &rH); 

Это может вызвать сбой во время выполнения, если RFM2gOpen пытается изменить строку.

Ниже меньше шансов вызвать сбой памяти, но она до сих пор не определенно поведение:

std::string s("\\.\rfm2g1"); 
RFM2gOpen(const_cast<char*>(s.c_str()), &rH); 

Чтобы быть полностью совместимыми вам необходимо скопировать «\ \ rfm2g1.» На изменяемый буфер. Что-то вроде:

char *s = alloca(strlen("\\.\rfm2g1")+1); 
strcpy(s, "\\.\rfm2g1"); 
RFM2gOpen(s, &rH); 

Реальное исправление, конечно, для RFM2gOpen быть обновлен, чтобы принять const char*.

0

Казалось бы, что функция RFM2gOpen() ожидает неконстантную char* в качестве первого параметра (see here), как это иногда может случиться с устаревшими API (или API, написанный ленивых кодеров), и строковые litterals имеют тип const char* так происходит устаревшее неявное преобразование (избавление от определителя константы).

Если вы * 100% уверен, что эта функция не будет изменять заостренный-памяти, а затем итолькотогда вы можете просто поставить явное преобразование, например,const_cast<char*>("\\\\.\\rfm2g1") или (C-стиль) (const char*)"\\\\.\\rfm2g1"

2

Как говорится в сообщении, преобразование из const char* в char* (который C++ унаследовал от древнего языка C, который не имел const) является устаревшим.

Чтобы избежать этого, вы можете сохранить параметры в неконстантного строке, и передать функции:

char parameter[] = "\\\\.\\rfm2g1"; 
RFM2G_STATUS result; 
result = RFM2gOpen(parameter, &rH); 

Таким образом, вам избежать некрасивых слепки.

+0

Большое вам спасибо, что это работает и со мной –