【问题标题】:Use value of string for wide string when declaring constants in C++在 C++ 中声明常量时使用字符串的值作为宽字符串
【发布时间】:2013-05-02 09:35:11
【问题描述】:

使用定义我可以声明一个使用常规字符串值的宽字符串,如下所示:

#define MY_STRING "my value"
#define MY_WIDE_STRING L"" MY_STRING

我怎样才能实现相同但使用成员变量和初始化列表 - 即类似这样的东西......

class MyClass
{
    private:
         const std::string MY_STRING
         const std::wstring MY_WIDE_STRING
    public:
         MyClass():MY_STRING("my value"), MY_WIDE_STRING(L"" MY_STRING)
         {
         }

谢谢

【问题讨论】:

    标签: c++ string unicode constants


    【解决方案1】:

    一个可能的解决方案:

    #define MY_VALUE "my value"
    
    class MyClass
    {
      private:
        const std::string MY_STRING
        const std::wstring MY_WIDE_STRING
      public:
        MyClass():MY_STRING(MY_VALUE), MY_WIDE_STRING(L"" MY_VALUE)
        {}
      // ...
    };
    

    我认为您需要同一字符串的charwchar_t 版本的原因是因为您正在调用您无法控制的不同库。当您必须拥有另一个版本时,最好进行从一个到另一个的运行时转换,而不是保持字符串的两个副本同步。

    【讨论】:

    • 代码宏展开时,编译器会看到MY_WIDE_STRING(L"" "my value")L"""my value 是不同数据类型的独立文字。不能保证编译器会在将 L 前缀应用于最终连接结果之前将引号连接在一起。为确保连接,您必须改用L"my value"
    • @RemyLebeau:我不是语言律师,但标准说,“在翻译阶段 6 (2.2) 中,相邻的字符串文字被连接起来。......如果一个字符串文字没有 encoding-prefix,它被视为与另一个操作数相同的 encoding-prefix 的字符串文字。” [S2.14.5 P13] 这似乎表明这应该按预期工作。
    【解决方案2】:

    你不是。 MY_STRING 在这种情况下不是宏,因此您不能使用预处理器串联。

    如果您认为需要存储两个字符串,我建议您重新设计。

    【讨论】:

    • 好的,谢谢。在那种情况下,我如何将 MY_STRING 转换为 MY_WIDE_STRING 并将其保持为常数。这可以在初始化列表中完成吗?
    • @fxfuture:不。你认为你为什么需要那个?
    • 我想指定一个常量字符串值,并在类实例化后立即将其作为宽字符串提供给函数,因此我不必每次都转换它
    • @fxfuture:你为什么需要“转换它”?为什么你不坚持其中一个?
    • 我有两个不同的功能。一种处理字符串,一种处理宽字符串。我需要在这两个功能中都可以使用“我的价值”
    【解决方案3】:

    试试这样的:

    #define MY_VALUE "my value"
    
    #define MAKE_WIDE_STRING_NX(S) L ## S
    #define MAKE_WIDE_STRING(S) MAKE_WIDE_STRING_NX(S)
    
    class MyClass
    {
        private:
             const std::string _str;
             const std::wstring _wstr;
        public:
             MyClass(): _str(MY_VALUE), _wstr(MAKE_WIDE_STRING(MY_VALUE))
             {
             }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-28
      • 2015-11-26
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多