簡體   English   中英

C++ 文字和常量之間的連接

[英]C++ concatenation between literal and constant

我是 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

謝謝

operator<< 不是連接運算符,它是 stream 類型的特殊重載運算符,可讓您將數據發送到 stream。 它僅在您使用 stream 時才有效。

您在這里有兩個選擇。 首先,您可以使用 std::wstring:

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

或者您可以使用 wstringstream(來自<sstream>標頭):

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

在這種情況下,使用stream.str()獲取結果字符串。 stream 方法的優點是即使不是所有要連接的東西都已經是字符串,也可以使用它。

如果您要打印到現有的 stream(如 wcout),您當然可以跳過字符串流並直接使用它。

正如其他答案所指出的,您可以使用L"Initial Catalog=DatabaseName;Data Source=" SERVER_NAME L";" 如果 SERVER_NAME 是使用#define 創建的常量。 但是,如果它是一個const wchar_t*則不起作用。

<<>>不是連接運算符,而是按位移位運算符,完全不相關。

這對初學者來說很困惑,因為它們已經被coutcin重載以表示完全不同的東西。

C 和 C++ 中字符串文字的連接無需特殊運算符,因此只需鍵入:

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

SERVER_NAME可能不是寬字符串。 但是,絕對有問題的是您的";" 不是寬字符串。 嘗試使用L";"

如果要連接此字符串,請使用 std::stringstream

std::stringstream ss;
ss << "Initial Catalog=DatabaseName;Data Source=" << SERVER_NAME << ";";
std::string final = ss.str();
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";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM