Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Använd nyckelordet _Generic för att skriva kod som väljer ett uttryck vid kompileringstillfället baserat på typen av argument. Det liknar överlagring i C++ där typen av argument väljer vilken funktion som ska anropas. I det här fallet väljer typen av argument vilket uttryck som ska utvärderas.
Uttrycket _Generic(42, int: "integer", char: "character", default: "unknown"); utvärderar till exempel typen av 42 och söker efter matchningstypen , inti listan. Den hittar den och returnerar "integer".
Syntax
generic-selection:
_Generic
(assignment-expression, assoc-list)
assoc-list:
association
assoc-list, association
association:
type-name : assignment-expression
default : assignment-expression
Den första assignment-expression kallas för det kontrollerande uttrycket. Typen av kontrolluttrycket bestäms vid kompileringstillfället och matchas mot assoc-list för att hitta vilket uttryck som ska utvärderas och returneras. Det kontrollerande uttrycket utvärderas inte. Resulterar till exempel _Generic(intFunc(), int: "integer", default: "error"); inte i ett anrop vid körning till intFunc.
När typen av kontrolluttrycket bestäms, const, volatileoch restrict tas bort innan matchningen mot assoc-list.
Poster i som assoc-list inte har valts utvärderas inte.
Begränsningar
- Det
assoc-listgår inte att ange samma typ mer än en gång. - Det
assoc-listgår inte att ange typer som är kompatibla med varandra, till exempel en uppräkning och den underliggande typen av uppräkning. - Om en allmän markering inte har något standarduttryck får kontrolluttrycket bara ha ett kompatibelt typnamn i den allmänna associationslistan.
Exempel
Ett sätt att använda _Generic är i ett makro. Huvudfilen <tgmath.h> använder _Generic för att anropa rätt matematisk funktion beroende på typen av argument. Makrot för cos mappar till exempel ett anrop med en flyttal till cosf, samtidigt som ett anrop mappas med en komplex dubbel till ccos.
I följande exempel visas hur du skriver ett makro som identifierar vilken typ av argument du skickar till det. Den genererar "unknown" om ingen post i assoc-list matchar det kontrollerande uttrycket:
// 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
*/
Kravspecifikation
Kompilera med /std:c11.
Windows SDK 10.0.20348.0 (version 2104) eller senare. Se Windows SDK för att ladda ned den senaste SDK:en. Instruktioner för att installera och använda SDK för C11- och C17-utveckling finns i Installera C11- och C17-stöd i Visual Studio.