Genel seçim (C11)

Bağımsız değişkenin türüne _Generic göre derleme zamanında bir ifade seçen kod yazmak için anahtar sözcüğünü kullanın. C++ dilinde aşırı yüklemeye benzer ve bağımsız değişkenin türü hangi işlevin çağrılacağı seçilir. Bu durumda, bağımsız değişkenin türü değerlendirilecek ifadeyi seçer.

Örneğin, ifade _Generic(42, int: "integer", char: "character", default: "unknown"); türünü 42 değerlendirir ve listede eşleşen türü arar int. Bunu bulur ve döndürür "integer".

Sözdizimi

generic-selection:
_Generic( assignment-expression, assoc-list )

assoc-list:
association
assoc-list, association

association:
type-name : assignment-expression
default : assignment-expression

İlki assignment-expression denetim ifadesi olarak adlandırılır. Denetimli ifadenin türü derleme zamanında belirlenir ve hangi ifadenin assoc-list değerlendirilip döndürüleceği bulmak için ile eşleştirilir. Denetim ifadesi değerlendirilmez. Örneğin, _Generic(intFunc(), int: "integer", default: "error"); çalışma zamanında çağrısına intFuncneden olmaz.

Denetim ifadesinin türü belirlendiğinde, constile eşleşmeden assoc-listönce , volatileve restrict kaldırılır.

içinde assoc-list seçilmeyen girdiler değerlendirilmez.

Sınırlamalar

  • aynı assoc-list türü birden çok kez belirtemez.
  • assoc-list, bir numaralandırma ve bu numaralandırmanın temel türü gibi birbiriyle uyumlu türleri belirtemez.
  • Genel bir seçimin varsayılanı yoksa, denetim ifadesinin genel ilişkilendirme listesinde yalnızca bir uyumlu tür adı olmalıdır.

Örnek

Bir makroda kullanmanın _Generic bir yolu vardır. <tgmath.h> üst bilgi dosyası, bağımsız değişkenin türüne bağlı olarak doğru matematik işlevini çağırmak için kullanır_Generic. Örneğin, bir cos çağrıyı float cosfile ile eşlerken, karmaşık bir çift ccosiçeren bir çağrıyı ile ile eşler.

Aşağıdaki örnek, geçirdiğiniz bağımsız değişkenin türünü tanımlayan bir makronun nasıl yazıldığını gösterir. içinde denetim ifadesiyle assoc-list eşleşen bir giriş yoksa üretir"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
*/

Gereksinimler

ile derleyin /std:c11.

Windows SDK 10.0.20348.0 (sürüm 2104) veya üzeri. En son SDK'yı indirmek için bkz. Windows SDK' sı. C11 ve C17 geliştirmesi için SDK'yı yükleme ve kullanma yönergeleri için bkz . Visual Studio'da C11 ve C17 desteğini yükleme.

Ayrıca bkz.

/std (Dil standart sürümünü belirtin)
Tür-genel matematik