警告:已弃用从字符串常量转换为'ACE_TCHAR *'

时间:2013-02-01 14:18:45

标签: c++ linux gcc ace

我正在尝试编写单元测试,我们将构造函数调用为表单中的泛型类:

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

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

正如名称所示,字符串常量是常量。因此,为了使警告消失,正确的解决方案确实是将指针转换为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 :(得分:1)

字符串文字的类型是“const char数组”。通过隐式数组到指针转换,您可以使用它来初始化或分配给const char *

但是有一个特殊规则,字符串文字也可以隐式转换为char *(不带const)。此规则与旧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);