프로그램이 실행되는 디렉토리는 어떻게 얻습니까?


269

C / C ++를 사용하여 프로그램이 실행되고있는 디렉토리의 전체 경로를 가져 오는 플랫폼에 구애받지 않고 파일 시스템에 구애받지 않는 방법이 있습니까? 현재 작업 디렉토리와 혼동하지 마십시오. (clib 또는 STL과 같은 표준 라이브러리가 아닌 경우 라이브러리를 제안하지 마십시오.)

(플랫폼 / 파일 시스템과 무관 한 방법이 없다면, 특정 파일 시스템에 대해 Windows 및 Linux에서 작동하는 제안도 환영합니다.)


@ chakrit : 그거 좋겠다. (이 문제는 일반적으로 Windows에서 나타나지 않습니다.)
Ashwin Nanjappa

2
에서 경로를 안정적으로 추출 할 수 없다면이 argv[0]기술은 운영 체제에 따라 크게 달라집니다.
David R Tribble

1
간단히 말하면 '현재 디렉토리'또는 '프로그램이 실행되는 디렉토리'(질문의 용어로)는 프로그램의 이미지 파일 (~ .exe 파일)이있는 디렉토리입니다. '현재 작업 디렉토리'는 디렉토리이며 프로그램이 상대 경로를 사용하는 경우 자동 완성됩니까?
colemik

3
때 당신은 #include <windows.h>Windows가 자동으로이 박았 char*의 실행 파일 경로에 _pgmptr. Windows에서만 작업하는 경우 추가 기능을 호출하거나 정크를 가정 할 필요가 없습니다.
rsethc

1
이 의견은 3 년 전의 의견이지만 rsethc의 의견을 확대하고 싶습니다 _pgmptr. MSDN 설명서에는 _pgmptr_wpgmptr변수가 더 이상 사용되지 않으므로 함수를 사용 _get_pgmptr(char**)하거나 _get_wpgmptr(wchar_t**)대신 사용해야합니다 . MSDN
Hydranix

답변:


181

실행중인 앱의 전체 경로를 얻는 코드는 다음과 같습니다.

윈도우 :

int bytes = GetModuleFileName(NULL, pBuf, len);
return bytes ? bytes : -1;

리눅스 :

int bytes = MIN(readlink("/proc/self/exe", pBuf, len), len - 1);
if(bytes >= 0)
    pBuf[bytes] = '\0';
return bytes;

3
나는 이것이 이것이 질문에 대답하는 유일한 대답이라고 생각하며 Windows와 Linux 모두에 대해 그렇게합니다. 좋은 작업.
Frank Szczerba

6
Boo for / proc / pid / exe-어떤 이유로 OS X에서 지원되지 않습니다.
Chris Lutz

24
/proc일부를 보는 코드가 보이면 조금 죽습니다. 전 세계가 리눅스는 아니며, 심지어 하나의 플랫폼에서도 /proc버전마다, 아치에서 아치로 변경 될 수 있습니다.
asveikau

4
리눅스에서 별칭 명령을 사용하여 시작하면 argv [0]는 "명령 이름"입니까 아니면 확장 되었습니까?
Andy Dent

20
char pBuf[256]; size_t len = sizeof(pBuf);솔루션을보다 명확하게하기 위해 추가하는 것은 어떻습니까 .
charles.cc.hsu

166

프로그램을 처음 시작할 때 현재 디렉토리를 가져 오면 프로그램이 시작된 디렉토리를 효과적으로 갖게됩니다. 변수에 값을 저장하고 나중에 프로그램에서 참조하십시오. 이것은 현재 실행 가능한 프로그램 파일을 보유한 디렉토리 와 다릅니다 . 반드시 같은 디렉토리 일 필요는 없습니다. 누군가 명령 프롬프트에서 프로그램을 실행 하면 프로그램 파일이 다른 곳에 존재하더라도 명령 프롬프트의 현재 작업 디렉토리 에서 프로그램이 실행 되고 있습니다.

getcwd는 POSIX 기능이며 모든 POSIX 호환 플랫폼에서 기본적으로 지원됩니다. 유닉스에서는 올바른 헤더 unistd.h와 윈도우에서는 direct.h를 포함하는 것 외에는 특별한 작업을 수행 할 필요가 없습니다.

C 프로그램을 작성 중이므로 시스템의 모든 프로세스에 의해 링크 된 기본 c 런타임 라이브러리와 링크되며 (특히 조작 된 예외는 피함) 기본적으로이 기능을 포함합니다. CRT는 OS에 대한 기본 표준 호환 인터페이스를 제공하므로 외부 라이브러리로 간주되지 않습니다.

Windows에서 getcwd 기능은 _getcwd를 위해 더 이상 사용되지 않습니다. 이 방식으로 사용할 수 있다고 생각합니다.

#include <stdio.h>  /* defines FILENAME_MAX */
#ifdef WINDOWS
    #include <direct.h>
    #define GetCurrentDir _getcwd
#else
    #include <unistd.h>
    #define GetCurrentDir getcwd
 #endif

 char cCurrentPath[FILENAME_MAX];

 if (!GetCurrentDir(cCurrentPath, sizeof(cCurrentPath)))
     {
     return errno;
     }

cCurrentPath[sizeof(cCurrentPath) - 1] = '\0'; /* not really required */

printf ("The current working directory is %s", cCurrentPath);

44
좋은 대답이지만 "현재 작업 디렉토리"가 원하는 것이 아니라고 생각했습니다.
Michael Burr

4
일부 문서에서 cCurrentpath가 null 일 수 있고 getcwd에 의해 할당 될 것이라고 말하더라도 getcwd는 Mac OS에서 무언가를 할당하지 않고 프로그램을 조용히 중단시키는 것처럼 보입니다
Janusz

4
cCurrentPath는해야한다 :이 작은 오류가 있지만, 불행하게도 나는 편집은 아직 .. 10 행 수 없습니다 cCurrentpath은
리 피스

8
Windows의 IMO POSIXy 명명 기능 (일부 밑줄로 시작)은 일반적으로 피해야합니다. 실제 Windows API가 아니라 CRT입니다. 사용하려는 Windows API는 GetCurrentDirectory ()입니다. msdn.microsoft.com/ko-kr/library/aa364934(VS.85).aspx
asveikau

6
마이크의 대답은 맞습니다. "현재 디렉토리"가 바이너리가 실행되는 디렉토리와 항상 같은 것은 아닙니다. 예를 들어 앱이 Windows에서 서비스로 실행되는 경우 현재 디렉토리는 아마도 C : \ Windows \ System32 인 반면 바이너리 디렉토리는 다릅니다.
Lucky Luke

42

이것은 cplusplus 포럼에서 온 것입니다

Windows에서 :

#include <string>
#include <windows.h>

std::string getexepath()
{
  char result[ MAX_PATH ];
  return std::string( result, GetModuleFileName( NULL, result, MAX_PATH ) );
}

Linux에서 :

#include <string>
#include <limits.h>
#include <unistd.h>

std::string getexepath()
{
  char result[ PATH_MAX ];
  ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX );
  return std::string( result, (count > 0) ? count : 0 );
}

HP-UX에서 :

#include <string>
#include <limits.h>
#define _PSTAT64
#include <sys/pstat.h>
#include <sys/types.h>
#include <unistd.h>

std::string getexepath()
{
  char result[ PATH_MAX ];
  struct pst_status ps;

  if (pstat_getproc( &ps, sizeof( ps ), 0, getpid() ) < 0)
    return std::string();

  if (pstat_getpathname( result, PATH_MAX, &ps.pst_fid_text ) < 0)
    return std::string();

  return std::string( result );
}

1
해당 Windows 솔루션은 경로에서 ANSI 이외의 문자를 처리하지 않습니다. 아마도 GetModuleFileNameW를 사용하여 명시 적으로 UTF-8로 변환해야합니다 (파일 시스템 명령을 실행할 때마다 다시 변환해야합니다).
Adrian McCarthy

3
Windows 솔루션의 error: cannot convert 'char*' to 'LPWCH {aka wchar_t*}' for argument '2' to 'DWORD GetModuleFileNameW(HMODULE, LPWCH, DWORD)'경우 MinGW로 컴파일 할 때 오류가 발생 합니다.
HelloGoodbye

2
@Adrian, Im 일반적으로 Windows 프로그래머는 아니지만 컴파일러가 _W () 기능을 자동으로 사용하도록 컴파일러에 알려주는 DEFINE 또는 어쨌든 있습니까?
Octopus

1
@Octopus : 와이드 콜을 사용하려면 char 대신 WCHAR 및 std :: string 대신 std :: wstring을 사용해야합니다.
Adrian McCarthy

29

라이브러리가없는 표준 방법을 원할 경우 : 아니오. 디렉토리의 전체 개념이 표준에 포함되지 않습니다.

근사 표준 라이브러리에 대한 (이동식) 의존성이 괜찮다면, Boost의 파일 시스템 라이브러리 를 사용하고 initial_path ()를 요청하십시오 .

좋은 업보로 얻을 수있는 가장 가까운 IMHO (부스트는 잘 확립 된 고품질 라이브러리 세트)


8
Boost 문서에서 : template <class Path> const Path & initial_path (); main ()에 들어갈 때 current_path ()를 리턴합니다. 그리고 current_path ()는 'POSIX getcwd ()에 의한 것처럼'입니다. 이것은 질문자가 요청한 것이 아닙니다.
Jonathan Leffler


언급했듯이, 이것은 다른 폴더에서 시작할 수 있기 때문에 바이너리에 대한 경로가 아니라 바이너리가 호출 된 경로를 제공합니다.
jpo38

21

파일 시스템 TS 는 이제 표준 이며 gcc 5.3+ 및 clang 3.9+에서 지원되므로 다음과 같은 current_path()기능을 사용할 수 있습니다 .

std::string path = std::experimental::filesystem::current_path();

gcc (5.3+)에서 파일 시스템을 포함하려면 다음을 사용해야합니다.

#include <experimental/filesystem>

코드와 -lstdc++fs플래그를 연결하십시오 .

Microsoft Visual Studio에서 파일 시스템을 사용하려면 이 내용읽으십시오 .


6
1-2) Returns the absolute path of the current working directory, obtained as if by POSIX getcwd. (2) returns path() if error occurs. OP가 구체적으로 현재 작업 디렉토리가 아닌 실행 파일의 현재 경로를 묻기 때문에 참조 링크에서 Downvoted.
S. Saad

20

나는 이것에 대한 답변을 던지는 것이 매우 늦다는 것을 알고 있지만, 내 대답만큼 유용한 답변이 없다는 것을 알았습니다. CWD에서 bin 폴더로의 경로를 얻는 매우 간단한 방법은 다음과 같습니다.

int main(int argc, char* argv[])
{
    std::string argv_str(argv[0]);
    std::string base = argv_str.substr(0, argv_str.find_last_of("/"));
}

이제 이것을 상대 경로의 기본으로 사용할 수 있습니다. 예를 들어이 디렉토리 구조가 있습니다.

main
  ----> test
  ----> src
  ----> bin

소스 코드를 bin으로 컴파일하고 테스트 할 로그를 작성하여 코드 에이 줄을 추가 할 수 있습니다.

std::string pathToWrite = base + "/../test/test.log";

나는 전체 경로, 별명 등을 사용하여 Linux 에서이 접근법을 시도했지만 제대로 작동합니다.

노트:

창에있는 경우 '/'가 아닌 파일 구분 기호로 '\'를 사용해야합니다. 예를 들어 이것을 피해야합니다.

std::string base = argv[0].substr(0, argv[0].find_last_of("\\"));

나는 이것이 작동해야하지만 테스트되지는 않았다고 생각하므로 그것이 작동하면 의견을 주시면 안됩니다.


예, Windows에서도 작동합니다. 그게 최선의 해결책이라고 생각합니다. 내가 아는 한 argv [0]은 항상 실행 파일의 경로를 유지합니다.
Wodzu

4
argv[0]아주 좋은 생각이지만, 리눅스에서 얻는 것은 "./my_ executable_name"또는 "./make/my_ executable_name"입니다. 기본적으로 내가 얻는 것은 완전히 시작하는 방법에 달려 있습니다.
Xeverous

@Xeverous : 그래서 무엇? 실행 파일과 관련하여 열어야 할 파일이있는 경우 "./"또는 "./make/"에서 시작하여 작동해야합니다. "." 는 현재 작업 디렉토리이며 argv [0]은 거기에서 실행 파일의 상대 경로를 알려줍니다. 이는 정확히 OP가 원하는 것입니다. 그것은 어쨌든 내가 정확히 필요한 것입니다.
nilo

9

아니요, 표준적인 방법은 없습니다. C / C ++ 표준은 디렉토리 (또는 다른 파일 시스템 조직)의 존재조차 고려하지 않는다고 생각합니다.

Windows에서 hModule 매개 변수가 NULL 로 설정 되면 GetModuleFileName () 은 현재 프로세스의 실행 파일에 대한 전체 경로를 리턴합니다 . 나는 리눅스를 도울 수 없다.

또한 현재 디렉토리 또는 프로그램 이미지 / 실행 파일이있는 디렉토리를 원하는지 확인해야합니다. 그것은 당신의 질문이 약간 모호합니다.


9

Windows에서 가장 간단한 방법은 _get_pgmptr함수 를 사용 stdlib.h하여 실행 파일 이름을 포함하여 실행 파일의 절대 경로를 나타내는 문자열에 대한 포인터를 얻는 것입니다.

char* path;
_get_pgmptr(&path);
printf(path); // Example output: C:/Projects/Hello/World.exe

8

현재 작업 디렉토리를 argv [0]와 연결할 수 있습니까? Windows에서 작동하는지 확실하지 않지만 Linux에서는 작동합니다.

예를 들면 다음과 같습니다.

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char **argv) {
    char the_path[256];

    getcwd(the_path, 255);
    strcat(the_path, "/");
    strcat(the_path, argv[0]);

    printf("%s\n", the_path);

    return 0;
}

실행되면 다음을 출력합니다.

jeremy @ jeremy-desktop : ~ / Desktop $ ./test
/home/jeremy/Desktop/./test


argv [0]에 절대 경로가 제공되는지 확인해야합니다. 그러나 더 중요한 것은 이미지가 PATH를 통해 위치한다면 어떨까요? 리눅스는 전체 경로를 채우거나 명령 줄에 무엇입니까?
Michael Burr

Mike B가 지적했듯이 이는 일반적인 솔루션이 아닙니다. 매우 제한된 상황에서만 작동합니다. 기본적으로 상대 경로 이름으로 명령을 실행할 때만 ./test 대신 ../../../bin/progname을 실행할 때 그다지 우아하지는 않습니다.
Jonathan Leffler

argv [0]이 "../../myprogram.exe"일 수 있기 때문에 현재 디렉토리와 비교하여 argv [0]의 가능한 상대 경로를 해결하면 아마도 가장 안전한 방법 일 것입니다. 항상 작동하며 휴대 가능합니다 (Android에서도 작동합니다!).
jpo38


6

그 목적으로 argv [0]을 사용할 수 없습니다. 일반적으로 실행 파일에 대한 전체 경로를 포함하지만 반드시 그렇지는 않습니다. 프로세스는 필드에 임의의 값으로 생성 될 수 있습니다.

또한 현재 디렉토리와 실행 파일이있는 디렉토리는 서로 다른 두 가지이므로 getcwd ()는 도움이되지 않습니다.

Windows에서는 GetModuleFileName ()을 사용하고 Linux에서는 / dev / proc / procID / .. 파일을 읽으십시오 .


3

늦게 여기에 쌓여서 ...

언어는 기본 파일 시스템과 무관하므로 표준 솔루션이 없으므로 디렉토리 기반 파일 시스템의 개념은 c / c ++ 언어의 범위를 벗어납니다.

또한 현재 작업 디렉토리가 아니라 프로그램이 실행중인 디렉토리를 원합니다.이 디렉토리는 프로그램이 현재 위치에 어떻게 도달했는지를 고려해야합니다. 즉 포크를 통해 새로운 프로세스로 생성되었습니다. 솔루션이 시연 한 것처럼 프로그램이 실행중인 디렉토리를 가져 오려면 해당 운영 체제의 프로세스 제어 구조에서 해당 정보를 가져와야합니다.이 정보는이 질문에 대한 유일한 권한입니다. 따라서 정의에 따라 OS 특정 솔루션입니다.


3

콘솔의 Windows 시스템의 경우 system ( dir) 명령을 사용할 수 있습니다 . 콘솔은 디렉토리 등에 대한 정보를 제공합니다 . 에서 dir명령에 대한 정보를 읽으십시오 cmd. 그러나 유닉스 계열 시스템의 경우 모르겠다 ...이 명령이 실행되면 bash 명령을 읽으십시오. ls디렉토리를 표시하지 않습니다 ...

예:

int main()
{
    system("dir");
    system("pause"); //this wait for Enter-key-press;
    return 0;
}

2
#include <windows.h>
using namespace std;

// The directory path returned by native GetCurrentDirectory() no end backslash
string getCurrentDirectoryOnWindows()
{
    const unsigned long maxDir = 260;
    char currentDir[maxDir];
    GetCurrentDirectory(maxDir, currentDir);
    return string(currentDir);
}

1

POSIX 플랫폼에서는 getcwd ()를 사용할 수 있습니다 .

Windows에서는 사용할 수 있습니다 ) (_getcwd 의 사용으로, ()에 getcwd 사용되지 않습니다.

표준 라이브러리의 경우 Boost가 충분히 표준이라면 Boost :: filesystem을 제안했지만 제안에서 경로 정규화를 제거 한 것 같습니다. 완전한 표준 솔루션을 위해 TR2를 즉시 사용할 수있을 때까지 기다려야 할 수도 있습니다 .


10
getcwd ()는 질문자가 요청한 것을 수행하지 않습니다.
Jonathan Leffler

허용 된 답변이 getcwd ()를 사용하는 것이 아닙니까? 아니면 이해하는 것이 아닙니까?
Sнаđошƒаӽ

나는 당신이 정답으로 여겨지는 사람과 함께 왔기 때문에 공감했습니다.
Arnaud

이 답변은 질문을 해결하려고 시도조차하지 않습니다. 그것을 쓰는 것에 부끄러운 줄 아세요.
HelloWorld

1

상대 경로의 경우 여기에 내가 한 일이 있습니다. 나는이 질문의 나이를 알고 있으며, 대부분의 경우에 작동하는 더 간단한 답변을 제공하고 싶습니다.

다음과 같은 경로가 있다고 가정하십시오.

"path/to/file/folder"

어떤 이유로, 이클립스로 만든 리눅스 빌드 실행 파일은 이것과 잘 작동합니다. 그러나 이와 같은 경로를 사용하면 Windows가 매우 혼란 스럽습니다!

위에서 언급했듯이 실행 파일의 현재 경로를 얻는 방법은 여러 가지가 있지만 대부분의 경우 가장 쉬운 방법은 경로의 FRONT에 추가하는 것입니다.

"./path/to/file/folder"

"./"를 추가하면 정렬됩니다! :) 그런 다음 실행 파일 자체가있는 한 원하는 디렉토리에서로드를 시작할 수 있습니다.

편집 : 어떤 이유로 사용중인 개발 환경 인 경우 code :: blocks에서 실행 파일을 시작하려고하면 작동하지 않습니다.

EDIT2 : 내가 찾은 몇 가지 새로운 점은 코드에서 이와 같은 정적 경로를 지정하면 (Example.data 가로 드 해야하는 것으로 가정 함)입니다.

"resources/Example.data"

그런 다음 실제 디렉토리에서 앱을 시작하거나 Windows에서 바로 가기를 만들고 작업 디렉토리를 앱 디렉토리로 설정하면 작동합니다. 누락 된 리소스 / 파일 경로와 관련된 문제를 디버깅 할 때이 점을 명심하십시오. (특히 IDE에서 빌드 exe를 시작할 때 잘못된 작동 디렉토리를 설정 한 IDE에서)


1

라이브러리 솔루션 (요청하지는 않았지만). Qt를 사용하는 경우 : QCoreApplication::applicationDirPath()


1

내 두 센트이지만 다음 코드가 C ++ 17에서 작동하지 않습니까?

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main(int argc, char* argv[])
{
    std::cout << "Path is " << fs::path(argv[0]).parent_path() << '\n';
}

적어도 리눅스에서는 나를 위해 일하는 것 같습니다.

이전 아이디어를 바탕으로 이제

std::filesystem::path prepend_exe_path(const std::string& filename, const std::string& exe_path = "");

구현 :

fs::path prepend_exe_path(const std::string& filename, const std::string& exe_path)
{
    static auto exe_parent_path = fs::path(exe_path).parent_path();
    return exe_parent_path / filename;
}

그리고 초기화 트릭 main():

(void) prepend_exe_path("", argv[0]);

argv [0] 아이디어에 대해 @Sam Redway에게 감사드립니다. 물론 OP가 질문을했을 때 C ++ 17이 수년 동안 존재하지 않았다는 것을 알고 있습니다.


0

Boost Filesystem initial_path()은 POSIX와 같이 작동하며 getcwd()원하는 것을 스스로 수행하지는 않지만 argv[0]그중 하나에 추가 하면됩니다.

당신은 결과는 항상 꽤되지 않습니다 점에 유의 할 수 있습니다 - 당신은 같은 것을 얻을 수 /foo/bar/../../baz/a.out하거나 /foo/bar//baz/a.out,하지만 난 항상 어떤 이름이 실행 파일 (경로의 연속 슬래시 하나에 붕괴되는 것을 참고) 유효한 경로 결과 믿습니다.

나는 이전 에 (Linux에서는 효과가 있었지만 Windows에서는 작동하지 않는 envp세 번째 주장을 사용하여 해결책을 썼다. main()그래서 본질적으로 다른 사람과 동일한 해결책을 권장하지만 실제로 그것이 왜 정확한지에 대한 추가 설명과 함께 결과가 예쁘지 않더라도.


0

으로 Minok가 언급 한, 그런 기능은 INI C의 표준 또는 C ++ 표준을 지정하지 있습니다. 이것은 OS 고유의 기능으로 간주되며 POSIX 표준에 지정되어 있습니다.

Thorsten79 는 Boost.Filesystem 라이브러리라는 좋은 제안을했습니다. 그러나 링크 시간 종속성을 프로그램에 바이너리 형식으로 사용하지 않으려는 경우 불편할 수 있습니다.

내가 추천하는 좋은 대안은 100 % 헤더 전용 STLSoft C ++ 라이브러리의 모음입니다. Matthew Wilson ( C ++에 대한 필독서 저자). 이식 가능한 외관 PlatformSTL은 시스템 별 API (Windows 용 WinSTL 및 Unix의 UnixSTL)에 대한 액세스를 제공하므로 휴대용 솔루션입니다. 모든 시스템 별 요소는 특성과 정책을 사용하여 지정되므로 확장 가능한 프레임 워크입니다. 물론 파일 시스템 라이브러리가 제공됩니다.


0

progname 이 linux bash 명령 으로 프로그램 경로를보고합니다.

프로그램 내에서 which 명령을 실행하여 출력을 tmp 파일로 보내고 프로그램이 해당 tmp 파일을 읽더라도 해당 프로그램이 실행 중인지 여부는 알려주지 않습니다. 해당 이름의 프로그램이있는 위치 만 알려줍니다.

필요한 것은 프로세스 ID 번호를 얻고 이름의 경로를 파싱하는 것입니다.

내 프로그램에서 프로그램이 사용자의 bin 디렉토리 또는 경로의 다른 디렉토리 또는 / usr / bin에서 실행되었는지 알고 싶습니다. / usr / bin은 지원되는 버전을 포함합니다. 제 생각에는 리눅스에는 이식성이 뛰어난 솔루션이 있습니다.



0

실험 파일 시스템을 사용하는 C ++ 11부터, 공식 파일 시스템을 사용하는 C ++ 14-C ++ 17에서 작동합니다.

application.h :

#pragma once

//
// https://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros
//
#ifdef __cpp_lib_filesystem
#include <filesystem>
#else
#include <experimental/filesystem>

namespace std {
    namespace filesystem = experimental::filesystem;
}
#endif

std::filesystem::path getexepath();

application.cpp :

#include "application.h"
#ifdef _WIN32
#include <windows.h>    //GetModuleFileNameW
#else
#include <limits.h>
#include <unistd.h>     //readlink
#endif

std::filesystem::path getexepath()
{
#ifdef _WIN32
    wchar_t path[MAX_PATH] = { 0 };
    GetModuleFileNameW(NULL, path, MAX_PATH);
    return path;
#else
    char result[PATH_MAX];
    ssize_t count = readlink("/proc/self/exe", result, PATH_MAX);
    return std::string(result, (count > 0) ? count : 0);
#endif
}

좋은 답변이지만 선언이나 정의를 namespace에 추가하는 것은 정의되지 않은 동작std 입니다. 이를 피하려면 네임 스페이스 std::filesystemstd::experimental::filesystem선택한 세 번째 네임 스페이스를 모두 추가 하거나 전역 네임 스페이스에 using std::filesystem::path선언을 추가하지 않아도되는 경우을 사용 하면됩니다 path.
Cássio Renan 2016 년

C ++ 14 Experiment :: filesystem이 더 이상 사용되지 않는 것 같아서 잊어 버릴 수 있습니까? (첫 번째 #if 지점으로 이동)
TarmoPikaro 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.