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 intFunc
neden olmaz.
Denetim ifadesinin türü belirlendiğinde, const
ile eşleşmeden assoc-list
önce , volatile
ve 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 cosf
ile ile eşlerken, karmaşık bir çift ccos
iç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.