다음을 통해 공유


일반 선택(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, volatilerestrictassoc-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 지원 설치를 참조하세요.

추가 정보

/std(언어 표준 버전 지정)
형식-제네릭 수학