std::wstring::data() 사용 시 주의점(c++17)

Jooss·2024년 3월 28일
0

cpp

목록 보기
7/7
post-custom-banner

c++17 부터 data()의 리턴값에 const가 제외되었습니다. (대신 c++20에서 constexpr가 붙네요 왜 없앴냐)

그래서 windows api 사용 시 매개변수를 통해 문자열 데이터를 받아 올 경우 LPWSTR 매개변수로 사용 가능하게 되었죠.

c++17 이전

  • 문자열 변수를 통해 한번 거쳐서 받아와야 함
int main()
{
	std::wstring originalPath = L"%SystemRoot%\\SomeFolder\\SomeFile.txt";
    wchar_t expandedPath[MAX_PATH]{ 0 };

    // 환경 변수를 확장하여 치환된 경로를 얻습니다.
    ExpandEnvironmentStringsW(originalPath, expandedPath, MAX_PATH);
    originalPath = expendedPath;

    std::wcerr << L"test: " << originalPath << std::endl;

    return 0;
}
  • 결과
    test1: C:\Windows\SomeFolder\SomeFile.txt

c++17 사용 시

  • .data() 함수를 사용하여 한번에 받아오는것이 가능해짐
int main()
{
	std::wstring originalPath = L"%SystemRoot%\\SomeFolder\\SomeFile.txt";

    // 환경 변수를 확장하여 치환된 경로를 얻습니다.
    ExpandEnvironmentStringsW(originalPath, originalPath.data(), MAX_PATH);

    std::wcerr << L"test: " << expandedPath << std::endl;

    return 0;
}
  • 결과
    test1: C:\Windows\SomeFolder\SomeFile.txt

이와 같이 큰 문제가 없이 동작하여 환경변수를 실제 경로로 변환해주는 ExpandEnvironmentStringsW에 적용하여 사용 중에 있었습니다.

이슈 발생

동일한 코드 방식으로 %SystemRoot% 대신 %ProgramFiles(x86)%값이 매개변수로 들어 간 상황에서의 결과는 이전과는 판이하게 달랐습니다.

  • 결과
    test: C:\Program Files (x86)86)86)86)86)86)86)86)86)

ExpandEnvironmentStringsW의 리턴값인 value도 정상적으로 나타납니다.

원인은 std::wstring::data()?

이런저런 테스트를 해 보다가 결국 기존 방식대로의 접근은 문제가 없이 정상적으로 나타남을 확인하였습니다.

int main()
{
	std::wstring originalPath = L"%ProgramFiles(x86)%\\SomeFolder\\SomeFile.txt";
    wchar_t expandedPath[MAX_PATH]{ 0 };

    // 환경 변수를 확장하여 치환된 경로를 얻습니다.
    ExpandEnvironmentStringsW(originalPath, expandedPath, MAX_PATH);
    originalPath = expendedPath;

    std::wcerr << L"test: " << originalPath << std::endl;

    return 0;
}
  • 결과: test: C:\Program Files (x86)\SomeFolder\SomeFile.txt

뭐가 문제일까?

알 수 없어요.
함수 내부를 까볼수도 없는 상황이라 무엇이 문제인지 현재로써는 알 수 없는 상황입니다. 구조상 std::wstring쪽의 이슈 가능성이 더 커보입니다.

테스트 과정에서 추가로 알게 된 것은 wide string이 아닌 string을 사용했다면 std::string::data()는 함수 실행 자체가 실패합니다. 처음부터 적용을 안 했을것 같네요

profile
개발자 세상을 여행중인 히치하이커입니다.
post-custom-banner

0개의 댓글