【问题标题】:warning: deprecated conversion from string constant to ‘ACE_TCHAR*’警告:不推荐将字符串常量转换为“ACE_TCHAR*”
【发布时间】:2013-02-01 14:18:44
【问题描述】:

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

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

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

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

有什么想法吗?

【问题讨论】:

  • 显而易见的解决方法是让构造函数采用const 指针。
  • 不要使用class 作为标识符。它是 C++ 中的保留关键字。或许使用klass
  • 我们不允许修改第三方提供的src。我的脑海里闪过这个想法。

标签: c++ linux gcc ace


【解决方案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};

【讨论】:

  • 太棒了!谢谢先生,正是我想要的。
【解决方案2】:

字符串文字的类型是“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);

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 2012-09-09
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2011-12-28
    • 2014-04-30
    相关资源
    最近更新 更多