상위 질문
타임라인
채팅
관점
C23 (C 표준 개정판)
위키백과, 무료 백과사전
Remove ads
C23, 공식적으로 ISO/IEC 9899:2024는 C17 (표준 ISO/IEC 9899:2018)을 대체하는 C 프로그래밍 언어의 현재 개방형 표준이다.[1] 2016년에 C2x로 비공식적으로 시작되었으며,[2] 2024년 10월 31일에 발행되었다.[3] 발행된 문서와 가장 유사한 무료 초안은 N3220 문서이다.[4] (아래 사용 가능한 텍스트 참조) C2x 초안을 위한 첫 WG14 회의는 2019년 10월에 개최되었고,[5] 2020년에는 코로나19 범유행으로 인해 가상 원격 회의가 개최되었고, 2024년까지 다양한 전화 회의가 계속되었다.
C23에서 __STDC_VERSION__의 값은 201710L에서 202311L로 변경된다. "C17" 및 "C23"이라는 일반적인 이름은 ISO 표준 식별자(9899:2018 및 9899:2024)의 연도보다는 최종 채택 전에 고정된 이러한 값을 반영한다.
Remove ads
기능
요약
관점
C23의 최신 작업 초안에 통합된 변경 사항은 다음과 같다.[6]
표준 라이브러리
새로운 함수
- 최적화 여부에 관계없이 메모리 저장이 항상 수행되어야 하는 민감한 데이터를 지우기 위해
<string.h>에memset_explicit()함수를 추가한다.[7] - POSIX 및 SVID C 확장과 유사하게 문자열을 효율적으로 연결하기 위해
<string.h>에memccpy()함수를 추가한다.[8] - POSIX 및 SVID C 확장과 유사하게 문자열의 복사본을 할당하기 위해
<string.h>에strdup()및strndup()함수를 추가한다.[9] - 포인터의 바이트 정렬을 확인하기 위해
<stdlib.h>에memalignment()함수를 추가한다.[10] - 새로운 헤더
<stdbit.h>에 비트 유틸리티 함수/매크로/유형을 추가하여 많은 정수 유형을 검사한다. 모두 레거시 코드 및 타사 라이브러리와의 충돌을 최소화하기 위해stdc_로 시작한다.[11]- 다음에서
*를uc,us,ui,ul,ull로 대체하여 다섯 가지 함수 이름을 만들거나, 유형 일반 매크로의 경우 공백으로 대체한다.[11] - 값의 1 또는 0 비트 수를 세는
stdc_count_ones*()및stdc_count_zeros*()를 추가한다.[11] - 값의 선행 1 또는 0 비트 수를 세는
stdc_leading_ones*()및stdc_leading_zeros*()를 추가한다.[11] - 값의 후행 1 또는 0 비트 수를 세는
stdc_trailing_ones*()및stdc_trailing_zeros*()를 추가한다.[11] - 값에서 첫 번째 선행 비트가 1 또는 0인 것을 찾는
stdc_first_leading_one*()및stdc_first_leading_zero*()를 추가한다.[11] - 값에서 첫 번째 후행 비트가 1 또는 0인 것을 찾는
stdc_first_trailing_one*()및stdc_first_trailing_zero*()를 추가한다.[11] - 값이 정확히 2의 거듭제곱인지 확인하는
stdc_has_single_bit*()를 추가한다 (단 하나의 1 비트만 있는 경우에만 true 반환).[11] - 값보다 크지 않은 가장 큰 정수 2의 거듭제곱을 결정하는
stdc_bit_floor*()를 추가한다.[11] - 값보다 작지 않은 가장 작은 정수 2의 거듭제곱을 결정하는
stdc_bit_ceil*()을 추가한다.[11] - 값을 나타내는 데 필요한 비트 수를 결정하는
stdc_bit_width*()를 추가한다.[11]
- 다음에서
- glibc 및 musl 라이브러리의 함수와 유사하게 시간 구조를 달력 시간 값으로 변환하는
<time.h>에timegm()함수를 추가한다.[12] - 단위로 작동하는 삼각 함수 및
exp10과 같은 IEEE 754-2019 권장 사항을 기반으로 하는 새로운<math.h>함수.[13]
기존 함수
printf()함수군에%b이진 변환 지정자를 추가한다.[14]scanf()함수군에%b이진 변환 지정자를 추가한다.[14]strtol()및wcstol()함수군에0b및0B이진 변환 지원을 추가한다.[14]bsearch(),bsearch_s(),memchr(),strchr(),strpbrk(),strrchr(),strstr(), 그리고 그들의 와이드 counterpart인wmemchr(),wcschr(),wcspbrk(),wcsrchr(),wcsstr()함수가 전달된 경우 const 한정된 객체를 반환하도록 한다.[15]
전처리기
#elifdef및#elifndef지시자를 추가한다.[16] 이는 기본적으로#elif defined및#elif !defined와 동일하다. 두 지시자 모두 C++23 표준 및 GCC 12에 추가되었다.[17]- 이진 리소스 포함을 위한
#embed지시자와 전처리기 지시자를 통해 리소스의 가용성을 확인할 수 있는__has_embed를 추가한다.[18] - 진단을 위한
#warning지시자를 추가한다.[19] - 전처리기 지시자를 통해 헤더의 가용성을 확인할 수 있는
__has_include를 추가한다.[20] - 전처리기 지시자를 통해 속성의 가용성을 확인할 수 있는
__has_c_attribute를 추가한다.[21] (새로운 속성 기능에 대한 "C++ 호환성" 그룹 참조) - 포함하는 매크로에 가변 인수가 전달된 경우에만 해당 인수로 확장되는 가변 매크로용
__VA_OPT__함수 매크로를 추가한다.[22]
유형
- null 포인터 유형인
nullptr_t를 추가한다.[23] - 비트 정밀 정수를 위한
_BitInt(N)및unsigned _BitInt(N)유형을 추가한다. 최대 비트 폭을 위한BITINT_MAXWIDTH매크로를 추가한다.[24][25] - 확인된 정수 연산을 위한
ckd_add(),ckd_sub(),ckd_mul()매크로를 추가한다.[26] - 가변 수정 유형 (스택에 할당되는 자동 변수인 VLA는 제외)은 필수 기능이 된다.[27]
- 배열과 함께
const를 사용하는 것에 대한 더 나은 지원.[28] Typeof(...)연산자의 표준화.[29]auto키워드의 의미가 변경되어 타입 추론을 유발하는 동시에, 유형과 함께 사용될 경우 기존의 저장 클래스 지정자로서의 의미도 유지한다. C++와 달리 C23은 객체 정의에만 타입 추론을 허용한다(함수 반환 유형 또는 함수 매개변수 유형은 추론하지 않음).[30]- 구조체, 공용체, 열거형의 호환성 규칙이 변경되어 동일한 태그를 가진 호환 유형의 재선언을 허용한다.[31]
- 정밀 너비 정수는 이제
intmax_t를 초과할 수 있다(N2888).[32]
상수
nullptr_t유형에 대한nullptr상수를 추가한다.[23]_BitInt(N)및unsigned _BitInt(N)유형에 대한wb및uwb정수 리터럴 접미사를 추가한다.[33] 예를 들어,6uwb는unsigned _BitInt(3)을 생성하고,-6wb는 세 개의 값 비트와 하나의 부호 비트를 가진signed _BitInt(4)를 생성한다.- 이진 리터럴 상수 접두사
0b및0B를 추가한다.[34] 예를 들어,0b10101010(0xAA와 동일). - 리터럴 상수에
'숫자 구분자를 추가한다.[35] 예를 들어,0xFE'DC'BA'98(0xFEDCBA98와 동일),299'792'458(299792458와 동일),1.414'213'562(1.414213562와 동일). enum의 기본 유형을 지정하는 기능을 추가한다.[36]- 고정된 기본 유형이 없는
enum이int로 표현할 수 없는 값을 저장할 수 있도록 허용한다.[37]
키워드
true및false키워드를 추가한다.[38]alignas,alignof,bool,static_assert,thread_local키워드를 추가한다. 이전에 정의된 키워드들은 대체 철자가 된다:_Alignas,_Alignof,_Bool,_Static_assert,_Thread_local.[39]_BitInt키워드 추가 ("유형" 그룹 참조)typeof및typeof_unqual키워드 추가 ("유형" 그룹 참조)nullptr키워드 추가 ("상수" 그룹 참조)constexpr키워드 추가 ("기타" 그룹 참조)- (선택적) 십진 부동소수점 연산을 위한
_Decimal32,_Decimal64,_Decimal128키워드 추가 ("기타" 그룹 참조)
구문
- 레이블은 선언 앞에 올 수 있으며 복합 문의 끝에도 올 수 있다.[40]
- 함수 정의에서 이름 없는 매개변수.[41]
{}를 사용한 0 초기화 (VLA 초기화 포함).[42]- 가변 인자 함수는 더 이상 줄임표 앞에 이름 있는 인수를 필요로 하지 않으며,
va_start매크로는 더 이상 두 번째 인수를 필요로 하지 않으며, 첫 번째 인수 이후의 인수는 평가하지 않는다.[43] - 이중 대괄호
[[]]를 사용하는 C++11 스타일 속성 구문을 추가한다.[44] 아래 나열된 C++11 속성 외에 새로운 속성을 추가한다. - C++17과의 호환성을 위해 단일 인수
_Static_assert를 추가한다.[46] - 프로토타입에 인수가 나열되지 않은 함수(예:
void foo())는 인수를 취하지 않는 것으로 이해된다 (K&R 함수 선언 제거 참조).
C++ 호환성
- 레이블이 선언 앞에 오는 것, 이름 없는 함수 인수,
{}를 사용한 0 초기화, 이름 있는 인수 없는 가변 인자 함수, C++11 스타일 속성,_Static_assert와 같은 다양한 구문 변경 사항은 C++와의 호환성을 향상시킨다 (구문 참조). 복합 문의 끝에 오는 레이블의 경우 C++23에 해당 변경 사항이 적용되었다.[47] - C++ 스타일 속성을 추가한다 (구문 참조). C++11과의 호환성을 위해
[[deprecated]],[48][[fallthrough]],[49][[maybe_unused]],[50][[nodiscard]],[51] 그리고[[noreturn]]속성을 추가한 다음, C11에서 도입된_Noreturn,noreturn, 헤더<stdnoreturn.h>기능을 더 이상 사용하지 않는다.[52] C++23과의 호환성을 위해 중복 속성이 허용된다.[53] 모든 표준 속성은 이중 밑줄로 둘러쌀 수도 있다 (예:[[__deprecated__]]는[[deprecated]]와 동일하다). - C++17과의 호환성을 위해 문자 리터럴에
u8접두사를 추가하여 UTF-8 인코딩을 나타낸다.[54][55] - C++23과의 호환성을 위해
#elifdef및#elifndef전처리기 지시자를 추가한다.[16] ("전처리기" 그룹 참조)
기타 기능
- 현재 IEEE 754 표준의 부동소수점 연산 버전인 ISO/IEC 60559:2020을 확장된 이진 부동소수점 연산 및 (선택적) 십진 부동소수점 연산으로 지원한다.[56][57]
- C++의 해당 기능과 달리 객체에 대한
constexpr지정자는 함수에는 적용되지 않는다.[58] - UTF-8로 인코딩된 데이터를 저장하기 위한
char8_t유형을 추가하고 u8 문자 상수 및 문자열 리터럴의 유형을char8_t로 변경한다. 또한, 좁은 멀티바이트 문자를 UTF-8 인코딩으로 변환하고 UTF-8에서 좁은 멀티바이트 문자 표현으로 단일 코드 포인트를 변환하는 함수인mbrtoc8()및c8rtomb()를 추가한다.[59] - 명시적으로 지정하지 않는 한 모든
char16_t문자열 및 리터럴은 UTF-16으로 인코딩되어야 하고, 모든char32_t문자열 및 리터럴은 UTF-32로 인코딩되어야 함을 명확히 한다.[60] - 복합 리터럴 정의에 저장 클래스 지정자를 허용한다.[61]
Remove ads
더 이상 사용되지 않는 기능
일부 오래된 기능은 C23의 작업 초안에서 제거되거나 더 이상 사용되지 않는다.
컴파일러 지원
다음 컴파일러는 이 표준을 지원하기 위한 실험적 컴파일러 플래그를 구현한다:
사용 가능한 텍스트
다른 C 표준판과 마찬가지로, 표준의 공식 ISO 텍스트는 무료로 제공되지 않는다.
공개된 C23 이전의 최신 작업 초안은 2023년 4월 1일자 N3096이었다.[6] 이 초안 이후 몇 달 동안 수백 가지 변경 사항[70]이 이루어져 2023년 7월 9일자 작업 초안 N3149와 2024년 2월 22일자 공식 초안 표준 N3219가 생성되었다.[70][71] 이 후자의 초안들은 공개되지 않았다.[70][71]
초안 표준 N3219가 발표된 같은 날, 새로운 작업 초안 N3220[4]이 공개되었다. 이 문서는 공식적으로 표준의 미래 버전 "C2Y"의 초안으로 설명되지만,[71] 동봉된 "편집자 보고서"는 N3220이 C23 초안 표준 N3219와 부록 K의 한 각주만 다르다고 명시한다.[71]
같이 보기
각주
더 읽어보기
외부 링크
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads