Подтвердить что ты не робот

Предупреждение: устаревшее преобразование из строковой константы в '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

4b9b3361

Ответ 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);