C++ - 파일 시스템/모듈 시스템

mohadang·2022년 10월 15일
0

C++

목록 보기
31/48
post-thumbnail

파일시스템

  • C++17의 새로운 라이브러리
  • C++14나 그 전에는 파일 시스템과 다음과 같은 구성요소에 대해 연산을 할 방법이 없었음
    • 경로(path)
    • 일반 파일
    • 디렉터리(directory)
  • 파일 읽기와 쓰기에 관한 라이브러리가 아님
  • 파일 속성 변경, 디렉터리 순회, 파일 복사 등에 관한 라이브러리
  • 이 모든 걸 std::fs로 할 수 있음
  • 그러면 파일시스템 없을때 어떻게 하였는가...
    • 각 OS에 있는 함수 썼음
    • Windows => CMD Shell 에서 명령어 호출
    • Linux => System Call 호출
  • 예전에 파일시스템을 건드리는 코드를 짜면 Windows, Linux용 함수를 따로 작성 해야 했음.

파일시스템 연산

  • 플랫폼 공통적인 방법으로 경로 합치기
    • Windows : \
    • Linux : /
    • 구문 어떤걸 사용하든 모든 플랫폼에서 사용 가능하게끔...
  • 파일과 디렉터리를 복사, 이름 바꾸기, 삭제
  • 디렉터리에서 파일, 디렉터리 목록 가져오기
  • 파일 권한 읽기 및 설정
  • 파일 상태 읽기 및 설정
  • 컴파일러에 따라 std::filesystem 네임스페이스 대신 std::experimental::filesystem::v1을 사용해야 될 수도 있음.
  • 리눅스, 윈도우 모두에서 작동
  • std::filesystem::status()
    • 파일 상태를 반환
      • 블록 파일(block file), 디렉터리, FIFO, 소켓(socket), ...
    • std::filesystem::file_status status = std::filesystem::status("C:\example");
    • std::filesystem::permissions()
      • 파일 권한을 반환한다.
        • 소유자의 읽기, 쓰기, 실행
        • 소유자와 같은 그룹의 읽기, 쓰기, 실행
        • 외부인의 읽기, 쓰기, 실행
      • std::filesystem::perms permissions = std::filesystem::status("C:\examples\rank.txt").permissions();

모듈 시스템

// Math.h
int Add(int a, int b)

// Math.cpp
int Add(int a, int b)
{
  return a + b;
}

// main.cpp
#include "Math.h"

int main()
{
  std::cout << Add(1,2) << std::endl;
}
  • [Math.cpp], [Math.h] 컴파일!!!

    • 컴파일 해서 Object[A] 파일 생성
  • main.cpp 컴파일!!!

    • 일단 Math.h에 있는 시그니쳐만 복사해 가져온다.
    • 일단 시그니쳐를 믿고 컴파일 해서 Object[B] 파일 생성
    • 생성된 Object 파일의 어셈블리는 함수 주소들이 텅텅 비어 있다
    • 함수 주소들이 텅텅 빈것 빼고는 인자를 넘기고 값을 리턴하는 어셈블리 코드는 정상적으로 있다
  • 링킹

    • Object[A]들을 보고 Object[B]에 있는 함수 주소 텅빈 곳을 채워 넣는다.
  • Ex) 모듈을 사용한 코드

// Math.ixx
module Math;
export int Add(int a, int b)
{
  return a + b;
}

// main.cpp
import Math;

int main()
{
  std::cout << Add(1,2) << std::endl;
}
profile
mohadang

0개의 댓글