1

私は最近、.net と Windows API について学び始めました。現在、シリアル ポートと通信するクラスを作成しています。

シリアル ポートに行を書き込むためにWriteLine、パラメーターを取る関数を使用しますSystem::String^System::String^からを初期化できるかどうか知りたいですstd::string

私は次のことができることに気付きました:

serialPort->WriteLine("stuff");

しかし、私はできません:

std::string data = "stuff";
serialPort->WriteLine(data.c_str());

また、私はできません:

char data[] = "stuff";
serialPort->WriteLine(data);

または

char* data = "stuff";
serialPort->WriteLine(data);

誰かがここで何が起こっているのか教えてもらえますか? 私がそれを渡すとき、VSはどういうわけかリテラルをそれ自身のものに変換していますか?

最後に、これが何に当てはまるのかよくわからないので、これに正しいタグを選択したかどうかはわかりません。

4

1 に答える 1

3

コンパイラは自動的に文字列リテラルを適切な文字列型の値に変換するため、いつでも文字列リテラルを使用して関数を呼び出すことができます。

ここでの問題は、.NET Framework のもの ( System::String) と標準の C++ 文字列型 ( std::string) を混ぜようとしているのに、うまく混ざらないことです。type のパラメーターを受け入れる .NET 関数は、 type のパラメーターを受け入れるように記述またはオーバーロードされSystem::Stringいませんstd::string。.NET Framework を使用している場合は、C++/CLI を使用しており、通常は C++ 文字列型ではなく .NET 文字列型を使用することが期待されています。

同様に、標準の C++ 関数はstd::string、.NET Framework の文字列型について何も認識していません。したがって、C++ 標準ライブラリから関数を呼び出す場合は、その文字列型を使用する必要があります。

C スタイルの文字列 ( char[]) は古いフォールバックであり、C++ コードを記述するときに実際に使用したいものではありません。std::string常により良いオプションでありc_str()、char 配列を必要とする API 関数を呼び出すときに使用することを既に知っているメソッドを提供します。しかし、他の 2 つの文字列型と同様に、これも相互変換できません。

遭遇する特に大きな問題の 1 つは、.NET Framework型が幅の広い (Unicode) 文字列でのみ機能するのに対しstd::string、型char[]は "狭い" (非 Unicode) 文字列のみを受け入れることです。System::Stringこれは、変換に関しては、ミックスにさらにレンチを投げかけます。キャストほど単純になる方法はありません。

しかし、それは、型間の変換が不可能だという意味ではありません。MSDN には、さまざまな C++ 文字列型の間で変換する方法を説明する役立つドキュメントがあります。

System::String要約すると、を受け入れる適切にオーバーロードされたコンストラクターを使用して、C スタイルの文字列から に変換できますchar*

const char* cString = "Hello, World!";
System::String ^netString = gcnew System::String(cString);
Console::WriteLine(netString);
delete netString;

そしてもちろん、上記のメソッドと メソッドを組み合わせることで、からstd::stringに変換できます。System::Stringc_str()

std::string stdString("Hello, World!");
System::String ^netString = gcnew System::String(stdString.c_str());
Console::WriteLine(netString);
delete netString;
于 2012-01-27T01:33:40.157 に答える