부록 G — C23이 보탠 것과 이 책에서의 자리
표준은 판마다 「무엇이 달라졌나」를 스스로 적어 둔다(C23 의 부속서 M.2). 그 목록을 기준으로, 이 책이 각 항목을 어디에서 다루는지를 모았다. 새 표준을 이미 아는 사람이 「그 이야기는 어느 장에 있나」를 찾는 자리이고, 반대로 다 읽은 사람이 「C23 을 빠짐없이 만났나」를 확인하는 자리이기도 하다.
★ 이 책은 C23 을 따로 가르치지 않는다. 옛 방식을 먼저 가르치고 새 방식을 덧붙이는 대신, 처음부터 C23 으로 설명하고 필요할 때만 「예전에는 이랬다」를 덧붙였다. 그래서 아래 항목들은 한자리에 모여 있지 않고 각자의 주제 속에 흩어져 있다. 이 표가 그 흩어진 자리를 잇는다.
언어#
| 무엇 | 요지 | 어디서 |
|---|---|---|
bool·true·false 등 키워드 승격 | 매크로였던 것이 낱말이 됐다 | 87장 |
nullptr 과 nullptr_t | 널을 위한 제 타입 있는 상수 | 37·87장 |
constexpr | 번역 시간에 값이 고정되는 객체 | 21·87장 |
typeof·typeof_unqual | 식의 타입을 그대로 받아 적는다 | 87장 |
auto 타입 추론 | 초기식에서 타입을 끌어낸다 | 87장 |
속성 [[…]] | 타입이 담지 못하는 뜻을 적는다(일곱) | 87장 |
_BitInt(N) | 폭을 내가 정하는 정수 | 21·28장 |
| 두 보수 확정·옛 부호 표현 제거 | 정수 표현이 하나로 못박혔다 | 6·28장 |
| 정수 한계의 폭 기반 재정의 | 보장 범위의 음수 쪽 끝이 바뀌었다 | 28장 |
이진 리터럴 0b | 비트를 비트로 적는다 | 21·51장 |
자릿수 구분자 ' | 1'000'000 처럼 끊어 읽는다 | 21장 |
빈 초기자 {} | 패딩까지 0 으로 채우는 초기화 | 47장 |
| 복합 리터럴의 저장 클래스 | 수명을 바꿔 쓸 수 있다 | 48장 |
| 열거체의 기반 타입 지정 | enum E : unsigned { … } | 27장 |
| 태그 호환 규칙 완화 | 같은 번역 단위 안에서도 호환된다 | 47장 |
| 라벨 위치 확장 | 선언 앞과 블록 끝에도 붙는다 | 32장 |
| K&R 식별자 목록 정의 제거 | 옛 함수 정의 문법이 사라졌다 | 62장 |
f() = f(void) | 빈 괄호가 「인자 없음」으로 못박혔다 | 62장 |
| 매개변수 이름 생략 허용 | 정의에서도 이름을 뺄 수 있다 | 62장 |
va_start 의 둘째 인자 불필요 | ... 앞의 매개변수가 없어도 된다 | 63장 |
| 가변 수정 타입 필수화 | VLA(variable length array) 자체는 여전히 선택 | 40장 |
| 유니코드 식별자 | 이름에 쓸 수 있는 글자가 정해졌다 | 8장 |
@·$·역따옴표(U+0060)를 문자 집합에 추가 | 소스에 쓸 수 있는 글자가 늘었다 | 8장 |
u8 문자 상수 | 문자열에만 있던 접두사가 문자에도 | 21장 |
u8·u·U 인코딩 못박음 | UTF-8·16·32 로 확정 | 8·75장 |
| 리터럴 인코딩 분리 | 실행 문자 집합과 리터럴 인코딩을 갈랐다 | 8장 |
| 넓은·좁은 리터럴 이어붙이기 제거 | 섞어 붙이는 것이 사라졌다 | 43장 |
| 잠재적으로 예약된 이름 | 예약과 비예약 사이에 눈금 하나 | 59장 |
ptrdiff_t 최소 폭 16 | 17 이었던 요구가 낮아졌다 | 27장 |
| 확장 정수 타입의 폭 예외 | int128_t 같은 것을 허용한다 | 28장 |
표 105.1 — C23 이 언어에 보탠 것
전처리기#
| 무엇 | 요지 | 어디서 |
|---|---|---|
#embed | 이진 자료를 소스에 그대로 들인다 | 61장 |
__VA_OPT__ | 가변 인자가 비었을 때를 다룬다 | 61장 |
__has_include | 헤더가 있는지 물어본다 | 51·86장 |
#elifdef·#elifndef | #elif defined 의 짧은 꼴 | 61장 |
#warning | 오류 없이 알린다 | 61장 |
한 인자 static_assert | 메시지를 생략할 수 있다 | 80장 |
표 105.2 — C23 이 전처리기에 보탠 것
라이브러리#
| 무엇 | 요지 | 어디서 |
|---|---|---|
<stdbit.h> | 비트 세기·회전이 표준 함수가 됐다 | 51·83장 |
<stdckdint.h> | 넘침을 값으로 알려 주는 산술 | 54·86장 |
unreachable | 「여기 오지 않는다」를 약속한다 | 54장 |
memset_explicit | 지우기가 최적화로 사라지지 않는다 | 70장 |
memalignment | 포인터의 정렬을 묻는다 | 67장 |
| 한정자 보존 검색 함수 | const 를 넣으면 const 가 나온다 | 70장 |
free_sized·free_aligned_sized | 아는 크기를 할당자에게 알려 준다 | 89장 |
realloc(p, 0) 은 UB(undefined behavior) | 예전의 회색지대가 계약 밖이 됐다 | 46장 |
시간 기준 여럿·timespec_getres | 단조 시계와 눈금 묻기 | 79장 |
timegm | mktime 의 UTC 판 | 79장 |
mbrtoc8·c8rtomb | <uchar.h> 의 빠져 있던 UTF-8 짝 | 75장 |
call_once 필수화 | 선택이 아니게 됐다 | 84장 |
POSIX 함수 편입(strdup 등) | 관행이던 것이 표준이 됐다 | 69–70장 |
intN_t 서식 길이 지정자 | printf·scanf 가 고정 폭 타입을 안다 | 66장 |
이진 정수 입출력 %b | 0b 를 찍고 읽는다 | 51장 |
| 헤더별 판 시험 매크로 | 무엇이 있는지 헤더가 스스로 밝힌다 | 19장 |
DECIMAL_DIG 폐기 예정 | 타입별 매크로가 대신한다 | 28장 |
_Imaginary_I 한정자 손질 | 선택 헤더의 작은 수선 | 83장 |
| IEC 60559 조화 | 부동소수점 규격을 더 정확히 따른다 | 52장 |
| 유효 타입 규칙 정밀화 | 앨리어싱의 근거가 또렷해졌다 | 40장 |
표 105.3 — C23 이 라이브러리에 보탠 것
이 표를 쓰는 법#
- 새 표준만 훑고 싶다면 — 위 세 표의 「어디서」만 따라 읽으면 C23 을 한 바퀴 돈다.
- 컴파일러가 받쳐 주는지 확인하려면 — 19장의 판별 표와
__STDC_VERSION__, 그리고 헤더별 판 시험 매크로를 함께 본다. ★ 표준에 있다고 컴파일러에 있는 것은 아니다 — 87장에서 두 컴파일러가[[unsequenced]]를 무시하는 것을 실측으로 보인다. - 옛 코드를 옮기려면 — 87장의 마지막 절이 순서를 정해 둔다.