Pergunta

Recentemente, comecei a aprender sobre .net e a API do Windows e atualmente estou escrevendo uma classe que fala sobre a porta serial.

Para escrever uma linha na porta serial, eu uso o WriteLine função que recebe um parâmetro, System::String^.Gostaria de saber se é possível inicializar o System::String^ a partir de um std::string.

Notei que posso fazer o seguinte:

serialPort->WriteLine("stuff");

mas não posso fazer:

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

além disso, não posso fazer:

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

nem

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

Alguém poderia me informar o que está acontecendo aqui?O VS está de alguma forma convertendo o literal em algo próprio quando eu o passo?

Por último, não tenho certeza se selecionei as tags corretas para isso, pois não sei realmente no que isso se enquadra.

Foi útil?

Solução

Você sempre pode chamar funções com literais de string porque o compilador converte isso automaticamente em um valor do tipo de string apropriado.

O problema aqui é que você está tentando misturar as coisas do .NET Framework (System::String) com o tipo de string C++ padrão (std::string) e eles simplesmente não se misturam bem.As funções .NET que aceitam um parâmetro do tipo System::String são não escrito ou sobrecarregado para aceitar um parâmetro do tipo std::string.Se você estiver trabalhando com o .NET Framework, estará usando C++/CLI e geralmente deverá usar o tipo de string .NET, não o tipo de string C++.

Analogamente, as funções padrão do C++ esperam std::string e não sei nada sobre o tipo de string do .NET Framework.Portanto, se você espera chamar funções da biblioteca padrão C++, você deve usar seu tipo string.

Strings estilo C (char[]) são o antigo substituto, não algo que você realmente queira usar ao escrever código C++. std::string é sempre uma opção melhor e ainda fornece a c_str() método que você já sabe usar ao chamar uma função de API que espera um array char.Mas, como os outros dois tipos de string, este também não é interconversível.

Um problema particularmente grande que você encontrará é que std::string e char[] tipos aceitam apenas strings "estreitas" (não Unicode), enquanto o .NET Framework System::String type funciona apenas com strings largas (Unicode).Isso é mais uma chave na mistura quando se trata de conversão.Não há como ser tão simples quanto um elenco.

Mas isso não significa que seja impossível converter entre os tipos.Há um documento útil no MSDN que explica como converter entre vários tipos de string C++.

Em resumo, você pode converter de strings de estilo C para System::String usando o construtor apropriadamente sobrecarregado que aceita um char*:

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

E então, é claro, você pode converter de para std::string para System::String combinando o método acima com o c_str() método:

std::string stdString("Hello, World!");
System::String ^netString = gcnew System::String(stdString.c_str());
Console::WriteLine(netString);
delete netString;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top