System::String^을 리터럴로 초기화하지만 string::c_str() 또는 char[]는 사용하지 않습니다.

StackOverflow https://stackoverflow.com/questions/9027824

문제

저는 최근에 .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는 내가 그것을 전달할 때 어떻게든 리터럴을 자신의 것으로 변환합니까?

마지막으로, 이것이 무엇에 해당하는지 모르기 때문에 올바른 태그를 선택했는지 잘 모르겠습니다.

도움이 되었습니까?

해결책

컴파일러가 이를 적절한 문자열 유형의 값으로 자동 변환하므로 항상 문자열 리터럴을 사용하여 함수를 호출할 수 있습니다.

여기서 문제는 .NET Framework 항목을 혼합하려고 한다는 것입니다(System::String)를 표준 C++ 문자열 유형(std::string), 그리고 그들은 단순히 잘 섞이지 않습니다.유형의 매개변수를 허용하는 .NET 함수 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 함수를 호출할 때 사용하려고 이미 알고 있는 메서드입니다.그러나 다른 두 문자열 유형과 마찬가지로 이 유형도 상호 변환이 불가능합니다.

당신이 직면하게 될 특히 큰 문제 중 하나는 std::string 그리고 char[] 유형은 "좁은"(유니코드가 아닌) 문자열만 허용하는 반면, .NET Framework는 System::String type은 와이드(유니코드) 문자열에서만 작동합니다.이는 전환과 관련하여 더 큰 혼란을 야기합니다.캐스트만큼 간단할 수는 없습니다.

그러나 이것이 유형 간 변환이 불가능하다는 의미는 아닙니다.MSDN에 설명하는 유용한 문서가 있습니다. 다양한 C++ 문자열 유형 간 변환 방법.

요약하면 C 스타일 문자열을 다음으로 변환할 수 있습니다. System::String 적절하게 오버로드된 생성자를 사용하여 char*:

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

그런 다음 물론 에서 로 변환할 수 있습니다. std::string 에게 System::String 위의 방법과 c_str() 방법:

std::string stdString("Hello, World!");
System::String ^netString = gcnew System::String(stdString.c_str());
Console::WriteLine(netString);
delete netString;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top