1

ここに私が持っているものがあります:

#define STRING "string 1"

string string2 = STRING + "string3";

これは間違っています。解決策は何ですか?一定でなければならない問題はstring2何ですか、それともその理由は何ですか?

4

3 に答える 3

8
#define STRING "string 1"

std::string string2 = STRING "string3";

隣接する文字列リテラルの連結は、プリプロセッサの機能ではなく、C/C++ の機能です。

于 2012-08-17T06:54:06.143 に答える
1

2 つの文字列リテラルで演算子 + を使用することはできません。これは、実質的に 2 つの char ポインターを追加しようとしていることを意味するためです。

目的を達成するには、次の 2 つの方法があります。

実行時の「文字列」連結 (プリプロセッサではない) を使用できますが、そのためには、文字列リテラルの 1 つから std::string を構築する必要があります。これにより、コンパイラはどの演算子 + オーバーロードを探すべきかを認識できます。

#define STRING "string 1"
string string2= string(STRING) + "string3"

または、コンパイル時の連結を使用するには、両方の文字列を文字列リテラルとして保持し、1 つずつ書き込むだけで、コンパイラはそれらを連結します。

#define STRING "string 1"
string string2= STRING "string3"

または(Cで答えるには):

#define STRING "string 1"
const char string2[]= STRING "string3"
于 2012-08-17T06:53:46.497 に答える
0

一般に、あなたはあなたSTRINGを として想像することができますconst char *。そのため、「別の const char* を自分に追加する方法」という概念はありません。

ケースを機能させるには、コンパイラにそれらを連結させることができます。

#define STRING "string 1"
std::string string2 = STRING "string3"

これは、文字列リテラル (ソース コード内で定義されている定数文字列) に対してのみ機能します。または、一般に、C-String を追加できるオーバーロードstd::stringを含む最初にそれを作成する必要があります。operator+

#define STRING "string 1"
std::string string2 = std::string(STRING) + "string3";
于 2012-08-17T06:55:46.623 に答える