C23 잡다한 내용
I’m ready to translate the article for you, but I’ll need the full text you’d like translated (the content after the source line). Could you please paste the rest of the article here? Once I have it, I’ll keep the source link unchanged and translate the rest into Korean while preserving all formatting, markdown, and technical terms.
Source:
소개
저는 C23의 개별 새로운 기능에 대해 몇 편의 글을 작성했습니다. 여기에는 attributes, auto(link), bool(link), 복합 리터럴에 대한 저장 클래스(link), constexpr(link), 열거형에 대한 명시적 기본 타입(link), nullptr(link), 그리고 typeof(link) 등이 있습니다. 각각을 별도의 글로 다루기엔 충분히 큰 내용이 아닌 몇 가지 잡다한 새로운 기능들이 있는데, 이 글에서는 그것들을 한데 모아 다루겠습니다.
Aggregate Initialization
이제 집합(배열, 구조체 및 unions)을 빈 = { } 로 초기화할 수 있습니다. 이전에는 중괄호 사이에 최소한 0을 포함시켜야 했습니다.
이진 리터럴
C는 생성 이래 십진수, 팔진수, 그리고 16진수 정수 리터럴을 가지고 있었습니다. C23은 C++14에서 도입된 이진 리터럴을 0b 또는 0B 접두사를 사용하여 채택했습니다:
int n = 0b101010; // 42 decimal
_BitInt
새로운 비트‑정밀 정수 타입이 추가되었습니다. _BitInt(n)에서 n은 양의 상수 정수 표현식입니다. 기본값은 부호가 있는(signed) 형태이며, unsigned 형태도 사용할 수 있습니다. (부호가 있는 경우, n에는 부호 비트가 포함됩니다.) 몇 가지 예시:
unsigned _BitInt(24) rgb24; // 24‑bit RGB color
unsigned _BitInt(256) sha256; // SHA‑256
n의 최대값은 구현에 따라 정의되지만, 최소한 unsigned long long과 같은 크기 이상입니다.
십진 부동소수점 타입
한동안 확장 기능으로 존재했지만, 새로운 십진 부동소수점 타입인 _Decimal32, _Decimal64, _Decimal128이 이제 공식적으로 지원됩니다.
십진 부동소수점 타입은 금액(달러, 유로, 파운드 등)과 관련된 계산에 더 적합합니다. 이는 표준 부동소수점 타입에서 발생하는 반올림 오류의 영향을 받지 않기 때문입니다. 일반적인 부동소수점 계산에는 표준 부동소수점 타입이 여전히 선호됩니다.
레이블 뒤 선언
goto 또는 case 레이블 바로 뒤에 선언을 배치할 수 있습니다:
error: // C < C23: error; C23: OK
int code;
이전에는 콜론(:) 뒤에 빈 문장(;) 같은 트릭을 사용해야만 합법적이었습니다. C 위원회가 C99에서 선언과 코드를 혼합하도록 허용했을 때 이를 합법화했어야 했지만, 늦게라도 이제는 가능합니다.
숫자 구분자
C23은 가독성을 높이기 위해 C++14에서 도입된 ' 문자를 숫자 구분자로 채택했습니다:
int n = 0b0010'1010;
int c = 299'792'458;
전체 값은 변하지 않으며, 원하는 대로 숫자를 그룹화할 수 있습니다. 쉼표는 이미 함수 인수를 구분하고 쉼표 연산자로 사용되기 때문에 사용할 수 없습니다.
K&R‑Style Functions
함수 프로토타입이 C89 (첫 번째 ANSI C)에서 C++로부터 도입되었음에도 불구하고, C는 여전히 “K&R 스타일” 함수 선언과 정의를 지원해 왔습니다:
char* strncpy(); // C < C23: unspecified arguments
char* strncpy( dst, src, n )
char *dst;
char const *src;
size_t n;
{
/* ... */
}
C23에서는 이러한 선언과 정의에 대한 지원이 삭제되었습니다.
새 키워드 철자
bool가 _Bool를 대체하고, alignas가 _Alignas를, alignof가 _Alignof를, static_assert가 _Static_assert를, thread_local이 _Thread_local을 대체합니다. 이전 철자는 여전히 지원되지만 더 이상 권장되지 않습니다.
새로운 전처리기 지시문
전처리기에는 이제 #elifdef, #elifndef, #embed, 및 #warning 지시문이 포함됩니다.
이름 없는, 사용되지 않은 매개변수
역사적으로 C에서는 사용되지 않는 매개변수에 이름을 붙여야 했으며, “unused” 경고를 없애는 일반적인 방법은 매개변수를 void로 캐스팅하는 것이었습니다:
char** cdecl_rl_completion( char const *text,
int start, int end ) {
(void)end; // unused
/* ... */
}
C23에서는 함수 선언에서처럼 이름을 생략할 수 있습니다.
__VA_OPT__
비록 GCC와 Clang에서 확장 기능으로 한동안 지원되었지만, __VA_OPT__ 은 이제 C 표준의 일부가 되었습니다.
가변 인자 함수
이전 기사에서 언급했듯이, 가변 인자 함수 는 이제 최소 하나의 필수 매개변수를 요구하지 않으며, 다음과 같이 작성할 수 있습니다:
void f( ... ) { // C23: no required parameter
va_list args;
va_start( args ); // C23: no second argument
/* ... */
}
이 기능은 C++에서 채택되었습니다.
결론
C23의 모든 변화 중에서 auto가 아마도 가장 많이 사용될 것입니다; 하지만 다른 변화들은 혁명적이진 않지만, 괜찮고 (때로는 오래 기다려온) 변화들입니다.