Устаревшее преобразование из строковой константы в 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)
{
//...
}

Функция c_str() из std::string учебный класс.

Другие вопросы по тегам