2013-02-01 41 views
0

我试图编写单元测试中,我们在窗体调用构造函数的泛型类弃用转换char*。在警告:从字符串常量“ACE_TCHAR *”

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

但随后编译失败,因为函数签名。

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

任何想法?

+1

最明显的解决方法是使构造带'const'指针。 – molbdnilo

+0

请勿使用'class'作为标识符。它是C++中的保留关键字。也许使用'klass' –

+0

我们不允许修改第三方提供的src。这个想法超出了我的想法。 –

回答

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}; 
+0

优秀!谢谢先生,我正在寻找什么。 –

1

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

但有一个特殊规则,即字符串文字也可以隐式转换为char *(不含const)。这个规则存在与旧C代码兼容,其中char * str = "string literal"是一个常见的习惯用法。使用它是很危险的,因为通过该指针修改指向字符数组的指针会导致未定义的行为(即,您的程序可能会崩溃或发生其他任何事情)。出于这个原因,该构造已被弃用,您的编译器会向您发出警告。

要建立有效的数据,你可以通过对作为非const字符指针,你可以使用

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

这也是一个很好的答案。感谢您的帮助! –

相关问题