일반 선택(C11)
_Generic
키워드를 사용하여 컴파일 시간에 인수의 형식을 기반으로 식을 선택하는 코드를 작성합니다. 인수의 형식으로 호출할 함수가 선택되는 C++의 오버로딩과 유사합니다. 여기서는 인수의 형식을 기반으로 평가할 식이 선택됩니다.
예를 들어 식 _Generic(42, int: "integer", char: "character", default: "unknown");
은 42
의 형식을 평가하고 목록에서 일치하는 형식 int
를 검색합니다. 이 형식을 찾아 "integer"
를 반환합니다.
구문
:
:
association
assoc-list
: association
:
type-name
, ,
default
, ,
첫 번째 assignment-expression
을 제어 식이라고 합니다. 제어 식의 형식은 컴파일 시간에 결정되고 assoc-list
와 비교되어 평가 및 반환할 식을 찾습니다. 제어 식은 평가되지 않습니다. 예를 들어 _Generic(intFunc(), int: "integer", default: "error");
은 런타임에 intFunc
를 호출하지 않습니다.
제어 식의 형식이 결정되면 const
, volatile
및 restrict
은 assoc-list
와 비교하기 전에 제거됩니다.
assoc-list
에서 선택되지 않은 항목은 평가되지 않습니다.
제약 조건
assoc-list
는 동일한 형식을 두 번 이상 지정할 수 없습니다.assoc-list
는 열거형과 해당 열거형의 기본 형식 같이 서로 호환되는 형식을 지정할 수 없습니다.- 일반 선택에 기본값이 없는 경우 제어 식에는 일반 연결 목록에 호환되는 형식 이름이 하나만 있어야 합니다.
예제
_Generic
을 사용하는 한 가지 방법은 매크로입니다. <tgmath.h> 헤더 파일은 _Generic
을 사용하여 인수의 형식에 따라 올바른 수학 함수를 호출합니다. 예를 들어 cos
에 대한 매크로는 cosf
에 float를 사용하는 호출을 매핑하고, complex double를 사용하는 호출은 ccos
에 매핑합니다.
다음 예제에서는 전달되는 인수의 형식을 식별하는 매크로를 작성하는 방법을 보여 줍니다. assoc-list
에 제어 식과 일치하는 항목이 없는 경우 "unknown"
을 반환합니다.
// Compile with /std:c11
#include <stdio.h>
/* Get a type name string for the argument x */
#define TYPE_NAME(X) _Generic((X), \
int: "int", \
char: "char", \
double: "double", \
default: "unknown")
int main()
{
printf("Type name: %s\n", TYPE_NAME(42.42));
// The following would result in a compile error because
// 42.4 is a double, doesn't match anything in the list,
// and there is no default.
// _Generic(42.4, int: "integer", char: "character"));
}
/* Output:
Type name: double
*/
요구 사항
/std:c11
를 사용하여 컴파일합니다.
Windows SDK 10.0.20348.0(버전 2104) 이상. 최신 SDK를 다운로드하려면 Windows SDK를 참조하세요. C11 및 C17 개발을 위한 SDK를 설치하고 사용하기 위한 지침은 Visual Studio에 C11 및 C17 지원 설치를 참조하세요.