警告:已弃用从字符串常量到“ACE_TCHAR*”的转换

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

本文关键字:TCHAR ACE 转换 常量 字符串 警告      更新时间:2023-10-16

我正在尝试编写单元测试,其中我们将构造函数调用到以下形式的泛型类:

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"};

但是由于函数签名,编译失败。

编辑:我不允许修改第三方代码,我只为它编写单元测试。

有什么想法吗?

字符串常量,顾名思义,是一个常量。因此,要使警告消失,正确的解决方案确实是将指针转换为常量指针。

如果无法做到这一点,您可以显式类型转换

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

或者先将字符串分配给非常量字符数组

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

字符串文字的类型是"const char数组"。通过隐式数组到指针的转换,您可以使用它来初始化或分配给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);