Sdílet prostřednictvím


Obecný výběr (C11)

Pomocí klíčového _Generic slova napište kód, který vybere výraz v době kompilace na základě typu argumentu. Podobá se přetížení v jazyce C++, kde typ argumentu vybere, která funkce se má volat. V tomto případě typ argumentu vybere, který výraz se má vyhodnotit.

Výraz například _Generic(42, int: "integer", char: "character", default: "unknown"); vyhodnotí typ 42 a vyhledá odpovídající typ intv seznamu. Najde ji a vrátí "integer".

Syntaxe

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čuje v době kompilace a porovná se s assoc-list tím, který výraz 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 do intFunc.

Při určení constvolatiletypu řídicího výrazu , a restrict jsou odebrány před porovnáváním proti assoc-list.

Položky, assoc-list které nejsou vybrány, se nevyhodnocují.

Omezení

  • Stejný assoc-list typ nelze zadat více než jednou.
  • Nelze assoc-list určit 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, musí mít řídicí výraz 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. Soubor <hlaviček tgmath.h> používá _Generic k volání správné matematické funkce v závislosti na typu argumentu. Například makro pro cos mapování volání s plovoucí cosfna , zatímco mapování volání se složitým dvojitým na ccos.

Následující příklad ukazuje, jak napsat makro, které identifikuje typ argumentu, který mu předáte. "unknown" Vytvoří se, 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ší Nejnovější sadu SDK si můžete stáhnout ze sady 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 (Určení standardní verze jazyka)
Matematika pro obecné typy