Sdílet prostřednictvím


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í consttypu řídicího výrazu se před porovnáním assoc-lists objektem odeberou , volatilea 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