Obecný výběr (C11)
_Generic
Klíčové slovo použijte k napsání kódu, který vybere výraz v době kompilace na základě typu argumentu. Podobá se přetížení v jazyce C++, kde typ argumentu vybere funkci, která se má volat. V tomto případě typ argumentu vybere, který výraz se má vyhodnotit.
Výraz _Generic(42, int: "integer", char: "character", default: "unknown");
například vyhodnocuje typ 42
a vyhledá odpovídající typ int
, v seznamu. Najde ho a vrátí "integer"
.
Syntax
generic-selection
:
_Generic
(assignment-expression
, assoc-list
)
assoc-list
:
association
assoc-list
, association
association
:
type-name
: assignment-expression
default
: assignment-expression
První assignment-expression
se nazývá řídicí výraz. Typ řídicího výrazu se určí v době kompilace a porovná se s výrazem assoc-list
, který se má vyhodnotit a vrátit. Řídicí výraz se nevyhodnocuje. Výsledkem například _Generic(intFunc(), int: "integer", default: "error");
není volání za běhu na intFunc
.
Při určení const
typu řídicího výrazu se před porovnáním assoc-list
s objektem odeberou , volatile
a restrict
.
Položky, assoc-list
které nejsou vybrané, se nevyhodnocují.
Omezení
- Stejný
assoc-list
typ nelze zadat více než jednou. - Nelze
assoc-list
zadat typy, které jsou vzájemně kompatibilní, například výčet a základní typ tohoto výčtu. - Pokud obecný výběr nemá výchozí hodnotu, řídicí výraz musí mít v seznamu obecných přidružení pouze jeden kompatibilní název typu.
Příklad
Jedním ze způsobů použití _Generic
je makro. Hlavičkový <soubor tgmath.h> používá _Generic
k volání správné matematické funkce v závislosti na typu argumentu. Makro například mapuje cos
volání s plovoucím textem na cosf
, zatímco volání se složitým dvojitým mapováním na ccos
.
Následující příklad ukazuje, jak napsat makro, které identifikuje typ argumentu, který mu předáte. Vytvoří "unknown"
, pokud žádná položka v řídicím výrazu assoc-list
neodpovídá:
// 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
*/
Požadavky
Zkompilovat pomocí /std:c11
.
Windows SDK 10.0.20348.0 (verze 2104) nebo novější. Informace o stažení nejnovější sady SDK najdete v tématu Windows SDK . Pokyny k instalaci a použití sady SDK pro vývoj pro C11 a C17 najdete v tématu Instalace podpory C11 a C17 v sadě Visual Studio.
Viz také
/std
(Zadejte standardní verzi jazyka.
Typově obecné matematické funkce
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro