предупреждение: не рекомендуется преобразовывать строковую константу в ACE_TCHAR *

Я пытаюсь написать модульные тесты, в которых мы вызываем конструктор для универсального класса в форме:

void testConstructor() {
int argc = 2;
ACE_TCHAR* argv[] = {"Input1", "Input2"};
MyClass *myClass = new MyClass(argc, argv);
/**processing**/
}

Думать о ACE_TCHAR* такой же как char*, Код выше приводит к

warning: deprecated conversion from string constant to ‘ACE_TCHAR*’

Я также попробовал:

void testConstructor() {
int argc = 2;
ACE_TCHAR* argv[2];
argv[0] = "Input1";
argv[1] = "Input2";
MyClass *myClass = new MyClass(argc, argv);
/**processing**/
}

Что приводит к той же ошибке.

Я где-то читал в Интернете, что это может быть смягчено с помощью

const ACE_TCHAR* argv[] = {"Input1", "Input2"};

Но тогда компиляция не удалась из-за сигнатуры функции.

Изменить: мне не разрешено изменять сторонний код, я только пишу для него модульные тесты.

Есть идеи?

0

Решение

Строковая константа, как следует из названия, является константой. Таким образом, чтобы убрать предупреждение, правильным решением было бы превратить указатель в указатель const.

Если это невозможно, вы можете явно указать тип

ACE_TCHAR* argv[] = {const_cast<ACE_TCHAR*>("Input1"),
const_cast<ACE_TCHAR*>("Input2")};

или сначала присвойте строки непостоянным массивам символов

char input1[] = "Input1";
char input2[] = "Input2";
ACE_TCHAR* argv[] = {input1, input2};
1

Другие решения

Тип строкового литерала «массив const charMsgstr «Путем неявного преобразования массива в указатель вы можете использовать это для инициализации или присвоения const char *,

Но есть специальное правило, что строковый литерал также может быть неявно преобразован в char * (без констант). Это правило существует для совместимости со старым кодом C, где char * str = "string literal" была общая идиома Использование этого опасно, потому что изменение массива указателей на символы через этот указатель вызывает неопределенное поведение (т. Е. Ваша программа может аварийно завершиться или может произойти что-либо еще). По этой причине конструкция устарела, и ваш компилятор предупреждает вас об этом.

Чтобы создать действительные данные, которые вы можете передать как неконстантные символьные указатели, вы можете использовать

const int argc = 2;
ACE_TCHAR argv0[] = "Input1";
ACE_TCHAR argv1[] = "Input2";
ACE_TCHAR* argv[] = { argv0, argv1 };
MyClass *myClass = new MyClass(argc, argv);
1