합법(Conformance)

합법(Conformance)

C 표준을 보면 구현이 "표준을 따른다(conforming)"는 게 정확히 무엇을 뜻하는지 세 갈래로 정의하고 있어요. 컴파일러나 런타임을 만드는 관점이 아니라도, "이 프로그램이 표준에 맞는 프로그램인가"를 판단할 때 이 기준이 그대로 쓰여요. 이 페이지에서 그 세 가지 정의와 프리스탠딩(freestanding) 환경의 특수성을 살펴볼게요.

출처: cppreference

본문

합법(conformance) 은 세 갈래로 정의돼요:

  • 엄격히 합법 프로그램(strictly conforming program) — 잘 정의된 언어 구문만 사용하는 프로그램, 즉 단일한 동작을 가지는 구문만 사용하는 프로그램이에요. 불특정·정의되지 않음·구현 정의 동작을 배제하고, 어떤 최소 구현 한계도 초과하지 않아요.
  • 합법 프로그램(conforming program) — 합법 구현이 받아들일 수 있는 프로그램.
  • 합법 구현(conforming implementation) — 합법 호스티드(hosted) 구현은 어떤 엄격히 합법 프로그램도 받아들여야 해요. 합법 프리스탠딩(freestanding) 구현은 라이브러리 절(clause 7)에 지정된 기능의 사용이 프리스탠딩 표준 라이브러리 헤더(아래 참조)의 내용으로 한정된 엄격히 합법 프로그램을 받아들여야 해요. 합법 구현은 확장(추가 라이브러리 함수 포함)을 가질 수 있지만, 그 확장이 어떤 엄격히 합법 프로그램의 동작을 바꾸지 않아야 해요.

설명 (Explanation)

표준은 번역 단위(translation unit)에 어떤 최소 구현 한계도 정의하지 않아요. 호스티드 환경은 운영체제를 가지지만, 프리스탠딩 환경은 가지지 않아요. 호스티드 환경에서 실행되는 프로그램은 라이브러리 절(clause 7)에 기술된 모든 기능을 사용할 수 있어요. 프리스탠딩 환경에서 실행되는 프로그램은 절 4가 요구하는 라이브러리 기능의 부분집합만 사용할 수 있어요.

프리스탠딩 표준 라이브러리 헤더 (Freestanding standard library headers)

모든 완전 프리스탠딩(fully freestanding) 헤더의 모든 표준 라이브러리 기능은 프리스탠딩 구현이 제공해야 해요.

일부 표준 라이브러리 헤더는 조건부 프리스탠딩이에요. 구현이 매크로 __STDC_IEC_60559_BFP____STDC_IEC_60559_DFP__를 미리 정의하면 <math.h><fenv.h>는 완전 프리스탠딩 헤더가 돼요. 다만 이 헤더들 안의 함수 동작은, 프로그램이 FENV_ACCESS 프라그마의 상태를 ON으로 설정하지 않을 때에만 프리스탠딩 환경에서 잘 정의된 것으로 요구돼요. 일부 표준 라이브러리 헤더는 부분적 프리스탠딩이에요. <stdlib.h>에서 memalignment는 프리스탠딩이에요. 추가로 __STDC_IEC_60559_BFP____STDC_IEC_60559_DFP__가 미리 정의되면 숫자 변환 함수(atoX, strtoX, strfromX)도 프리스탠딩이 되는데, 그 동작은 프로그램이 FENV_ACCESS 프라그마의 상태를 ON으로 설정하지 않을 때에만 프리스탠딩 환경에서 잘 정의된 것으로 요구돼요. <stdlib.h>의 다른 구성 요소는 프리스탠딩 구현이 제공할 필요가 없어요. <string.h>에서 strdup, strndup, strcoll, strxfrm, strtok, strerror는 프리스탠딩 구현이 제공할 필요가 없어요. (since C23)
완전 프리스탠딩 표준 라이브러리 헤더
<float.h> 부동소수점 타입의 한계
<iso646.h> (since C95) 대체 연산자 표기
<limits.h> 정수 타입의 범위
<stdalign.h> (since C11) alignasalignof 편의 매크로
<stdarg.h> 가변 인자
<stdbool.h> (since C99) 불리언 타입용 매크로
<stddef.h> 공통 매크로 정의
<stdint.h> (since C99) 고정 폭 정수 타입
<stdnoreturn.h> (since C11) noreturn 편의 매크로
<stdbit.h> (since C23) 타입의 바이트·비트 표현을 다루는 매크로
조건부 완전 프리스탠딩 표준 라이브러리 헤더
<fenv.h> (since C23) 부동소수점 환경
<math.h> (since C23) 공통 수학 함수
부분 프리스탠딩 표준 라이브러리 헤더
<stdlib.h> (since C23) 일반 유틸리티: 메모리 관리, 프로그램 유틸리티, 문자열 변환, 난수, 알고리즘
<string.h> (since C23) 문자열 처리

더 알아보기