【问题标题】:C++ concatenation between literal and constant文字和常量之间的 C++ 连接
【发布时间】:2011-06-07 14:46:35
【问题描述】:

我是 C++ 新手,我想知道为什么下面的行不正确。 (SERVER_NAME 已被定义为常量)

L"Initial Catalog=DatabaseName;Data Source=" << SERVER_NAME << ";"

我收到以下错误:

error C2296: '<<' : illegal, left operand has type 'const wchar_t [...' 
error C2308: concatenating mismatched strings

谢谢

【问题讨论】:

    标签: c++ literals string-concatenation


    【解决方案1】:

    operator

    这里有两个选择。首先,您可以使用 std::wstring:

    std::wstring(L"Initial Catalog=DatabaseName;Data Source=") + SERVER_NAME + L";";
    

    或者您可以使用 wstringstream(来自 &lt;sstream&gt; 标头):

    std::wstringstream stream;
    stream << L"Initial Catalog=DatabaseName;Data Source=" << SERVER_NAME << L";"
    

    在这种情况下,使用stream.str() 获取结果字符串。流方法的优点是即使不是所有要连接的东西都已经是字符串,您也可以使用它。

    如果您要打印到现有流(如 wcout),您当然可以跳过字符串流并直接使用它。

    正如其他答案所指出的,如果 SERVER_NAME 是使用#define 创建的常量,则可以使用L"Initial Catalog=DatabaseName;Data Source=" SERVER_NAME L";"。如果是const wchar_t*,那将无法正常工作。

    【讨论】:

    • 仅仅为了粘合编译时已知的三个常量而产生运行时开销?不这么认为。
    • L"string1" CONSTANT L"string2" 方法仅在常量是 #define 而不是实际常量时才有效。
    • 谢谢,它对我有用,是的,常数是#define
    • 如果我需要的最终结果是 LPCOLESTR 而不是 std::wstringstream 怎么办?
    • 使用流的str()方法得到std::wstring,使用c_str()方法得到字符串的const wchar_t*,这就是LPCOLESTR的typedef .您应该能够传递字符串;与BSTR不同,我认为LPOLESTR不需要任何特殊的分配方法。
    【解决方案2】:

    &lt;&lt;&gt;&gt; 不是连接运算符,而是位移运算符,完全不相关。

    这对初学者来说很困惑,因为他们已经为coutcin 带来了完全不同的含义。

    C 和 C++ 中字符串文字的连接无需特殊运算符,因此只需键入:

    L"Initial Catalog=DatabaseName;Data Source=" SERVER_NAME L";"
    

    【讨论】:

      【解决方案3】:

      可能SERVER_NAME 不是宽字符串。但是,绝对有问题的是您的 ";" 不是宽字符串。尝试使用L";"

      【讨论】:

        【解决方案4】:

        如果要连接此字符串,请使用 std::stringstream

        std::stringstream ss;
        ss << "Initial Catalog=DatabaseName;Data Source=" << SERVER_NAME << ";";
        std::string final = ss.str();
        

        【讨论】:

          【解决方案5】:
          std::wstring connectionString = "Initial Catalog=DatabaseName;Data Source=";
          connectionString += SERVER_NAME + ";";
          

          确保SERVER_NAME 被定义为宽字符串,如下所示:

          const wchar_t *SERVER_NAME = L"testdb";
          

          或者,

          std::wstring SERVER_NAME = L"testdb";
          

          【讨论】:

            猜你喜欢
            • 2021-08-27
            • 2015-04-06
            • 1970-01-01
            • 1970-01-01
            • 2015-06-04
            • 1970-01-01
            • 2015-08-16
            • 2017-08-07
            • 2016-05-05
            相关资源
            最近更新 更多