Question

J'ai récemment commencé à me renseigner sur .net et l'API Windows et j'écris actuellement un cours qui parle du port série.

Afin d'écrire une ligne sur le port série, j'utilise le WriteLine fonction qui prend un paramètre, System::String^.Je voudrais savoir s'il est possible d'initialiser le System::String^ de std::string.

J'ai remarqué que je peux faire ce qui suit :

serialPort->WriteLine("stuff");

mais je ne peux pas faire :

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

aussi, je ne peux pas faire :

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

ni

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

Quelqu'un pourrait-il me dire ce qui se passe ici ?Est-ce que VS convertit d'une manière ou d'une autre le littéral en son propre élément lorsque je le transmets ?

Enfin, je ne suis pas sûr d'avoir sélectionné les bonnes balises pour cela car je ne sais pas vraiment à quoi cela correspond.

Était-ce utile?

La solution

Vous pouvez toujours appeler des fonctions avec des chaînes littérales, car le compilateur les convertit automatiquement en une valeur du type de chaîne approprié.

Le problème ici est que vous essayez de mélanger les éléments du .NET Framework (System::String) avec le type de chaîne C++ standard (std::string), et ils ne se mélangent tout simplement pas bien.Les fonctions .NET qui acceptent un paramètre de type System::String sont pas écrit ou surchargé pour accepter un paramètre de type std::string.Si vous travaillez avec .NET Framework, vous utilisez C++/CLI et vous êtes généralement censé utiliser le type de chaîne .NET, et non le type de chaîne C++.

De manière analogue, les fonctions C++ standard attendent std::string et je ne sais rien du type de chaîne .NET Framework.Donc, si vous prévoyez d'appeler des fonctions de la bibliothèque standard C++, vous devez utiliser son type chaîne.

Chaînes de style C (char[]) sont l'ancienne solution de secours, pas quelque chose que vous souhaitez vraiment utiliser lors de l'écriture de code C++. std::string est toujours une meilleure option, et elle offre même le c_str() méthode que vous savez déjà utiliser lors de l’appel d’une fonction API qui attend un tableau de caractères.Mais comme les deux autres types de chaînes, celui-ci n’est pas non plus inter-convertible.

Un problème particulièrement important que vous rencontrerez est que std::string et char[] les types n'acceptent que les chaînes "étroites" (non Unicode), alors que le .NET Framework System::String type ne fonctionne qu'avec des chaînes larges (Unicode).Cela ajoute une clé supplémentaire au mélange en matière de conversion.Il est impossible que cela soit aussi simple qu'un casting.

Mais cela ne signifie pas qu’il est impossible de convertir entre les types.Il existe un document utile sur MSDN qui explique comment convertir entre différents types de chaînes C++.

En résumé, vous pouvez convertir des chaînes de style C en System::String en utilisant le constructeur surchargé de manière appropriée qui accepte un char*:

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

Et puis, bien sûr, vous pouvez convertir de vers std::string à System::String en combinant la méthode ci-dessus avec la c_str() méthode:

std::string stdString("Hello, World!");
System::String ^netString = gcnew System::String(stdString.c_str());
Console::WriteLine(netString);
delete netString;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top