Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usare la _Generic parola chiave per scrivere codice che seleziona un'espressione in fase di compilazione in base al tipo dell'argomento. È simile all'overload in C++ in cui il tipo dell'argomento seleziona la funzione da chiamare. In questo caso, il tipo dell'argomento seleziona l'espressione da valutare.
Ad esempio, l'espressione _Generic(42, int: "integer", char: "character", default: "unknown"); valuta il tipo di 42 e cerca il tipo corrispondente, int, nell'elenco. Lo trova e restituisce "integer".
Sintassi
generic-selection:
_Generic
(assignment-expression, assoc-list)
assoc-list:
association
assoc-list, association
association:
type-name : assignment-expression
default : assignment-expression
Il primo assignment-expression viene chiamato espressione di controllo. Il tipo dell'espressione di controllo viene determinato in fase di compilazione e confrontato con per trovare l'espressione assoc-list da valutare e restituire. L'espressione di controllo non viene valutata. Ad esempio, _Generic(intFunc(), int: "integer", default: "error"); non genera una chiamata in fase di esecuzione a intFunc.
Quando viene determinato il tipo dell'espressione di controllo, const, volatilee restrict vengono rimossi prima della corrispondenza con assoc-list.
Le voci in assoc-list che non vengono scelte non vengono valutate.
Vincoli
-
assoc-listNon è possibile specificare lo stesso tipo più di una volta. -
assoc-listNon è possibile specificare tipi compatibili tra loro, ad esempio un'enumerazione e il tipo sottostante di tale enumerazione. - Se una selezione generica non ha un valore predefinito, l'espressione di controllo deve avere un solo nome di tipo compatibile nell'elenco di associazioni generico.
Esempio
Un modo per usare _Generic è in una macro. Il <file di intestazione tgmath.h> usa _Generic per chiamare la funzione matematica corretta a seconda del tipo di argomento. Ad esempio, la macro per cos esegue il mapping di una chiamata con un oggetto float a cosf, mentre si esegue il mapping di una chiamata con un doppio complesso a ccos.
Nell'esempio seguente viene illustrato come scrivere una macro che identifica il tipo di argomento passato.
"unknown" Produce se nessuna voce nell'oggetto assoc-list corrisponde all'espressione di controllo:
// 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
*/
Requisiti
Eseguire la compilazione con /std:c11.
Windows SDK 10.0.20348.0 (versione 2104) o versione successiva. Vedi Windows SDK per scaricare l'SDK più recente. Per istruzioni su come installare e usare l'SDK per lo sviluppo C11 e C17, vedere Installare il supporto C11 e C17 in Visual Studio.
Vedi anche
/std (Specificare la versione standard della lingua)
Matematica generica di tipo