我正在尝试编写单元测试,我们将构造函数调用为表单中的泛型类:
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 :(得分: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);