Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
_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-lista típust nem lehet többször megadni. - Nem
assoc-listadható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