Предупреждение: устаревшее преобразование из строковой константы в 'char *' '
Возможный дубликат:
Как избавиться от предупреждений deprecated conversion from string constant to ‘char*’
в GCC?
Я использую следующую функцию из библиотеки, которую я не могу изменить:
HRESULT DynamicTag(char * pDesc, int * const pTag );
Я использую его следующим образом. Я создал объект класса, предоставляемый библиотекой, которая реализует вышеуказанную функцию.
int tag =0;
g_pCallback->DynamicTag("MyLogger", &tag);
Я получаю следующее предупреждение:
warning: deprecated conversion from string constant to 'char*'
Каков наилучший способ избавиться от вышеуказанного предупреждения? Я не хочу динамически выделять память.
Информация: Я использую компилятор Vxworks6.8
Ответы
Ответ 1
Работа с неизвестной библиотекой
При передаче литералов, а не других константных строк, и вы не уверены, что библиотека модифицирует строку, легко создать стек, выделенный временной копией литерала на С++ (на основе Как избавиться от` устаревшего преобразования из строковой константы в 'char * `предупреждения в GCC?:
char strMyLogger[]="MyLogger";
g_pCallback->DynamicTag(strMyLogger, &tag);
Использование явного приведения для работы с прототипом слабой библиотеки
В большинстве компиляторов явные преобразования избегают предупреждений, например:
g_pCallback->DynamicTag(const_cast<char *>("MyLogger"), &tag);
Примечание. Вы можете использовать это, только если вы уверены, что функция действительно никогда не меняет переданную строку (т.е. когда функция может быть объявлена как const char *, но это не так, возможно, потому, что библиотекарь забыл добавить его). Попытка изменить строковый литерал - это поведение undefined, и на многих платформах это приводит к сбою. Если вы не уверены, вам нужно создать записываемую копию строки, которая может быть распределена динамически или даже выделена в стеке, когда вы знаете какой-то верхний предел для размера строки.
Ответ 2
Учитывая, что вы не можете изменить DynamicTag
, вы должны изменить способ его вызова. Вы можете использовать, например:
char descr[] = "MyLogger";
g_pCallback->DynamicTag(descr, &tag);
Учитывая, что pDesc объявлен как аргумент [in], значит, он, вероятно, не будет изменен, поэтому вам может уйти с отбрасыванием const, но это плохая привычка.
Ответ 3
Передайте это значение как массив.
int tag =0;
char arr[] = "MyLogger";
g_pCallback->DynamicTag(arr, &tag);