Устаревшее преобразование из строковой константы в char * error
Возможный дубликат:
Прекращение преобразования C++ из строковой константы в 'char *'
У меня следующий код, хотя я не скопировал полный код, потому что он огромен. Следующий код находится в шаблоне класса, и я получаю предупреждение, как показано ниже. Из-за предупреждения в шаблоне я не могу создать его экземпляр и получить ошибку "экземпляр из отсюда".
предупреждение: устаревшее преобразование из строковой константы в 'char*''
void ErrorMessageInRaphsodyCode(char* pcCompleteMessage, char* pcMessage, char* pcFileName, unsigned int RowNo)
{
//...
}
char cCompleteMessage[200];
memset(cCompleteMessage, 0x00, sizeof(cCompleteMessage));
char*cMessage = "add reorgenize failed";
ErrorMessageInRaphsodyCode(cCompleteMessage, cMessage, "omcollec.h", __LINE__);
Мой вопрос, каков наилучший способ избавиться от вышеупомянутого предупреждения?
5 ответов
Если функция принимает char const *
, он гарантирует, что он читает только те данные, на которые указывает указатель. Однако, если он принимает неконстантный указатель, как char *
, это может написать ему.
Так как запись в строковый литерал недопустима, компилятор выдаст предупреждение.
Лучшее решение - изменить функцию, чтобы принять char const *
скорее, чем char *
,
char cMessage[] = "add reorganize failed";
Это должно избавиться от предупреждения.
Лучший способ избавиться от него - исправить функцию, принимающую параметр.
Если ваш код верен и функция действительно принимает строковые константы, это должно быть сказано в ее прототипе:
void ErrorMessageInRaphsodyCode(char* pcCompleteMessage, char* pcMessage, const char* pcFileName, unsigned int RowNo)
Если вы не можете этого сделать (у вас нет кода), вы можете создать встроенную оболочку:
inline void ErrorMessageInRaphsodyCodeX(char* p1, char* p2, const char* p3, unsigned int p4)
{ ErrorMessageInRaphsodyCode(p1,p2,(char*)p3,p4); }
и используйте вместо этого обертку.
Если ваш код неверен и функция действительно требует доступной для записи памяти (в чем я очень сомневаюсь), вам нужно будет сделать строку доступной для записи, либо создав локальный массив, как предложил Ян, либо malloc
достаточно памяти.
(1) Сделать переменную const char*
(..., const char* pcFileName, ...)
(2) Если вышеуказанное невозможно, и вы хотите сохранить состояние char*
а также const char*
затем сделать функцию template
:
template<typename CHAR_TYPE> // <--- accepts 'char*' or 'const char*'
void ErrorMessageInRaphsodyCode(char* pcCompleteMessage, CHAR_TYPE* pcMessage, char* pcFileName, unsigned int RowNo)
{
//...
}