Megosztás a következőn keresztül:


Általános kijelölés (C11)

_Generic A kulcsszóval olyan kódot írhat, amely fordításkor kiválaszt egy kifejezést az argumentum típusa alapján. Hasonló a C++ függvény túlterheléséhez, ahol az argumentum típusa kiválasztja a meghívandó függvényt. Ebben az esetben az argumentum típusa kiválasztja a kiértékelni kívánt kifejezést.

A kifejezés _Generic(42, int: "integer", char: "character", default: "unknown"); például kiértékeli a típust, és megkeresi 42 az egyező típust inta listában. Megkeresi és visszaadja "integer".

Szemantika

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

assoc-list:
association
assoc-list, association

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

Az elsőt assignment-expression vezérlő kifejezésnek nevezzük. A vezérlőkifejezés típusa a fordítási időpontban lesz meghatározva, és a kiértékelendő és visszaadandó assoc-list kifejezés megkereséséhez igazodik. A vezérlőkifejezés nincs kiértékelve. Például _Generic(intFunc(), int: "integer", default: "error"); nem eredményez hívást futásidőben a következőre intFunc: .

A vezérlőkifejezés típusának meghatározásakor a rendszer eltávolítja a vezérlőkifejezést, constvolatileés restrict eltávolítja őket, mielőtt megfelelteti azokatassoc-list.

assoc-list A nem kiválasztott bejegyzések kiértékelése nem történik meg.

Megszorítások

  • Ugyanazt assoc-list a típust nem lehet többször megadni.
  • Nem assoc-list adhatók meg az egymással kompatibilis típusok, például az enumerálás és az enumerálás mögöttes típusa.
  • Ha egy általános kijelölés nem rendelkezik alapértelmezett beállítással, a vezérlőkifejezésnek csak egy kompatibilis típusnévvel kell rendelkeznie az általános társítás listában.

példa

A használat _Generic egyik módja a makró. A <tgmath.h> fejlécfájl az argumentum típusától függően a megfelelő matematikai függvény meghívására használható _Generic . A makró cos például leképez egy lebegőpontos cosfhívást, miközben egy hívást komplex kettős ccosértékre képez le.

Az alábbi példa bemutatja, hogyan írhat olyan makrót, amely azonosítja a neki átadott argumentum típusát. Akkor keletkezik "unknown" , ha a assoc-list vezérlőkifejezésnek nincs bejegyzése:

// 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
*/

Követelmények

Fordítsa le a(z) /std:c11.

Windows SDK 10.0.20348.0 (2104-es verzió) vagy újabb. A legújabb SDK letöltéséhez tekintse meg a Windows SDK-t. A C11-hez és C17-hez készült SDK telepítésével és használatával kapcsolatos utasításokat a C11 és C17 telepítése a Visual Studióban című témakörben találja.

Lásd még

/std (A nyelvi standard verzió megadása)
Típus-általános matematika