Namespaces
Variants

Freestanding and hosted implementations

From cppreference.net

C++ 표준에 의해 정의된 구현에는 두 가지 종류가 있습니다: hosted freestanding 구현입니다. hosted 구현의 경우, C++ 표준에서 요구하는 표준 라이브러리 헤더 집합이 freestanding 구현보다 훨씬 더 큽니다. freestanding 구현에서는 운영체제 없이도 실행이 가능할 수 있습니다.

구현의 종류는 구현에 따라 정의됩니다. 미리 정의된 매크로 __STDC_HOSTED__ 는 호스티드 구현에서는 1 으로 확장되고, 프리스탠딩 구현에서는 0 으로 확장됩니다. (C++11부터)

목차

다중 스레드 실행 및 데이터 경쟁 에 대한 요구사항

freestanding hosted
freestanding 구현에서는 프로그램이 둘 이상의 실행 스레드 를 가질 수 있는지 여부는 구현에서 정의됩니다. hosted 구현에서는 C++ 프로그램이 동시에 실행되는 둘 이상의 스레드 를 가질 수 있습니다.
(C++11 이후)

main 함수에 대한 요구사항

freestanding hosted
freestanding 구현에서는 프로그램이 main 함수를 정의해야 하는지 여부는 구현에서 정의합니다. 시작과 종료는 구현에서 정의됩니다; 시작은 정적 저장 기간을 가진 네임스페이스 범위 객체들의 생성자 실행을 포함합니다; 종료는 정적 저장 기간 을 가진 객체들의 소멸자 실행을 포함합니다. hosted 구현에서는 프로그램이 전역 함수인 main 을 반드시 포함해야 합니다. 프로그램 실행은 main 함수가 호출되는 주요 실행 스레드 를 시작하며, 이 스레드에서 정적 저장 기간 을 가진 변수들이 초기화되고 소멸될 수 있습니다.

표준 라이브러리 헤더 에 대한 요구사항

독립형 구현체는 구현에서 정의된 헤더 집합을 갖습니다. 이 집합은 다음 표에 있는 헤더들을 최소한 포함합니다.

부분적으로 독립 실행형 헤더의 경우, 독립 실행형 구현은 해당 시놉시스에 있는 엔터티의 일부만 제공하면 됩니다:

  • 엔티티가 주석 처리된 경우 // freestanding , 해당 엔티티가 제공됨이 보장됩니다.
  • 엔터티(함수 또는 함수 템플릿)가 // freestanding-deleted 로 주석 처리된 경우, 해당 엔터티가 제공되거나 삭제됨이 보장됩니다.
(since C++26)
  • 엔티티가 시놉시스가 all freestanding 또는 // mostly freestanding 로 시작하는 헤더에서 선언된 경우, 해당 엔티티 자체가 주석 처리되지 않으면 제공이 보장됩니다.

독립형 구현에 필요한 헤더

라이브러리 구성 요소 헤더 독립 구현
언어 지원 공통 정의 <cstddef> All
C 표준 라이브러리 <cstdlib> 부분 지원
구현 속성 <cfloat>
<climits> (since C++11)
<limits>
<version> (since C++20)
All
정수 타입 <cstdint> (C++11 이후) 모두
동적 메모리 관리 <new> 모두
타입 식별 <typeinfo> 모두
소스 위치 <source_location> (C++20 이후) 모두
예외 처리 <exception> All
이니셜라이저 리스트 <initializer_list> (C++11 이후) 전체
비교 연산 <compare> (C++20부터) 전체 지원
코루틴 지원 <coroutine> (C++20부터) 모두
기타 런타임 지원 <cstdarg> 모두
디버깅 지원 <debugging> (C++26부터) 모두
컨셉 <concepts> (C++20부터) 전체
진단 오류 번호 <cerrno> (C++26부터) 부분적
시스템 오류 지원 <system_error> (C++26부터) 부분적
메모리 관리 메모리 <memory> (C++23 이후) 부분적
메타프로그래밍 타입 특성 <type_traits> (C++11부터) 전체
컴파일 시 유리수 연산 <ratio> (C++23부터) 모두
범용 유틸리티 유틸리티 컴포넌트 <utility> (since C++23) All
튜플 <tuple> (C++23 이후) 모두
함수 객체 <functional> (C++20부터) 부분적
기본 숫자 변환 <charconv> (C++26부터) 부분적
비트 조작 <bit> (C++20부터) 모두
문자열 문자열 클래스 <string> (C++26부터) 부분적
널 종료
시퀀스 유틸리티
<cstring> (C++26부터) 부분 지원
텍스트 처리 널 종료
시퀀스 유틸리티
<cwchar> (C++26부터) 부분적
반복자 <iterator> (C++23부터) 부분적
범위 <ranges> (C++23 이후) 부분적
Numerics 부동 소수점 타입을 위한
수학 함수
<cmath> (since C++26) 부분 지원
난수 생성 <random> (C++26부터) 부분 지원
동시성 지원 아토믹스 <atomic> (C++11 이후) 전체 [1]
실행 제어 <execution> (C++26부터) 부분적
사용 중단됨 헤더 <ciso646> (C++20까지)
<cstdalign> (C++11부터) (C++20까지)
<cstdbool> (C++11부터) (C++20까지)
모두
  1. 항상 락-프리(lock-free)인 정수형 원자 타입에 대한 지원과 타입 별칭 std::atomic_signed_lock_free std::atomic_unsigned_lock_free 의 존재는 독립형 구현(freestanding implementation)에서 구현에 따라 정의됩니다. (C++20부터)

참고 사항

일부 컴파일러 벤더는 독립형 구현을 완전히 지원하지 않을 수 있습니다. 예를 들어, GCC libstdc++는 버전 13 이전에 구현 및 빌드 문제가 있었던 반면, LLVM libcxx와 MSVC STL은 독립형을 지원하지 않습니다.

C++23에서는 많은 기능들이 부분 헤더와 함께 프리스탠딩으로 제공됩니다. 그러나 일부 헤더들이 향후 표준에서 프리스탠딩으로 전환될지 여부는 WG21에서 아직 논의 중입니다. 그럼에도 불구하고, vector , list , deque , 그리고 map 같은 컨테이너들은 예외와 힙에 대한 의존성으로 인해 절대 프리스탠딩이 되지 않을 것입니다.

GCC 13은 독립 실행 환경에서도 <optional> , <span> , <array> , 그리고 <bitset> 와 같은 더 많은 헤더를 제공하지만, 이러한 헤더들은 이식성이 떨어지거나 호스팅 구현과 동일한 기능을 제공하지 않을 수 있습니다. 툴체인이 이를 제공하더라도 독립 실행 환경에서 사용하는 것을 피하는 것이 좋습니다.

기능 테스트 매크로 표준 기능
__cpp_lib_freestanding_feature_test_macros 202306L (C++26) 독립형 기능 테스트 매크로
__cpp_lib_freestanding_algorithm 202311L (C++26) 프리스탠딩 <algorithm>
202502L (C++26) <algorithm> 에 더 많은 독립 실행형 기능
__cpp_lib_freestanding_array 202311L (C++26) 독립 실행 환경 <array>
__cpp_lib_freestanding_char_traits 202306L (C++26) 독립 실행 환경 std::char_traits
__cpp_lib_freestanding_charconv 202306L (C++26) 독립 실행 환경 <charconv>
__cpp_lib_freestanding_cstdlib 202306L (C++26) 독립 실행 환경 <cstdlib>
__cpp_lib_freestanding_cstring 202311L (C++26) 독립 실행 환경 <cstring>
__cpp_lib_freestanding_cwchar 202306L (C++26) 독립 실행 환경 <cwchar>
__cpp_lib_freestanding_errc 202306L (C++26) 독립 실행 환경 std::errc
__cpp_lib_freestanding_execution 202502L (C++26) 프리스탠딩 <execution>
__cpp_lib_freestanding_expected 202311L (C++26) 프리스탠딩 <expected>
__cpp_lib_freestanding_functional 202306L (C++26) 독립 실행 환경 <functional>
__cpp_lib_freestanding_iterator 202306L (C++26) 독립 실행 환경 <iterator>
__cpp_lib_freestanding_mdspan 202311L (C++26) 독립 실행 환경 <mdspan>
__cpp_lib_freestanding_memory 202306L (C++26) 독립 실행 환경 <memory>
202502L (C++26) <memory> 에 추가된 더 많은 독립 실행형 기능
__cpp_lib_freestanding_numeric 202311L (C++26) 독립 실행 환경 <numeric>
202502L (C++26) <numeric> 의 추가 freestanding 기능
__cpp_lib_freestanding_optional 202311L (C++26) 독립 실행 환경 <optional>
__cpp_lib_freestanding_random 202502L (C++26) 독립 실행 환경 <random>
__cpp_lib_freestanding_ranges 202306L (C++26) 독립 실행형 <ranges>
__cpp_lib_freestanding_ratio 202306L (C++26) 독립 실행 환경 <ratio>
__cpp_lib_freestanding_string_view 202311L (C++26) 독립 실행 환경 <string_view>
__cpp_lib_freestanding_tuple 202306L (C++26) 독립 실행 환경 <tuple>
__cpp_lib_freestanding_utility 202306L (C++26) 독립 실행 환경 <utility>
__cpp_lib_freestanding_variant 202311L (C++26) 프리스탠딩 <variant>

참고문헌

  • C++23 표준 (ISO/IEC 14882:2024):
  • 4.1 구현 준수 [intro.compliance] (p: 10)
  • 6.9.2 다중 스레드 실행 및 데이터 경쟁 [intro.multithread] (p: 84)
  • 6.9.3.1 main 함수 [basic.start.main] (p: 89)
  • 16.4.2.5 독립형 구현 [compliance] (p: 483)
  • C++20 표준(ISO/IEC 14882:2020):
  • 4.1 구현 준수 [intro.compliance] (p: 7)
  • 6.9.2 다중 스레드 실행 및 데이터 경쟁 [intro.multithread] (p: 77)
  • 6.9.3.1 main 함수 [basic.start.main] (p: 82)
  • 16.5.1.3 독립 구현 [compliance] (p: 470)
  • C++17 표준(ISO/IEC 14882:2017):
  • 4.1 구현 준수 [intro.compliance] (p: 5)
  • 4.7 다중 스레드 실행 및 데이터 경쟁 [intro.multithread] (p: 15)
  • 6.6.1 main 함수 [basic.start.main] (p: 66)
  • 20.5.1.3 독립형 구현 [compliance] (p: 458)
  • C++14 표준(ISO/IEC 14882:2014):
  • 1.4 구현 준수 [intro.compliance] (p: 5)
  • 1.10 다중 스레드 실행 및 데이터 경쟁 [intro.multithread] (p: 11)
  • 3.6.1 main 함수 [basic.start.main] (p: 62)
  • 17.6.1.3 독립형 구현 [compliance] (p: 441)
  • C++11 표준 (ISO/IEC 14882:2011):
  • 1.4 구현 준수 [intro.compliance] (p: 5)
  • 1.10 다중 스레드 실행 및 데이터 경쟁 [intro.multithread] (p: 11)
  • 3.6.1 main 함수 [basic.start.main] (p: 58)
  • 17.6.1.3 독립형 구현 [compliance] (p: 408)
  • C++03 표준(ISO/IEC 14882:2003):
  • 1.4 구현 준수 [intro.compliance] (p: 3)
  • 3.6.1 main 함수 [basic.start.main] (p: 43)
  • 17.4.1.3 독립형 구현 [lib.compliance] (p: 326)

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 1938 C++98 구현이 호스팅 구현인지 여부를
문서화할 필요가 없었음
구현 종류를 구현 정의 사항으로 지정
(따라서 문서화 필요)
LWG 3653
( P1642R11 )
C++20 <coroutine> 는 독립 실행형이지만
독립 실행형이 아닌 std::hash 를 사용함
<functional> 를 부분적으로
독립 실행형으로 만듦

참고 항목

C 문서 for Conformance