Tuttavia ho trovato un "trucco" per farlo se si utilizza GCC.
GCC ha un'estensione ## comoda sulla macro variadic che consente di simulare un argomento predefinito.
Il trucco ha limitazioni: funziona solo per 1 valore predefinito e l'argomento deve essere l'ultimo dei parametri di funzione.
Ecco un esempio funzionante.
#include <stdio.h>
#define SUM(a,...) sum(a, (5, ##__VA_ARGS__))
int sum (a, b)
int a;
int b;
{
return a + b;
}
main()
{
printf("%d\n", SUM(3, 7));
printf("%d\n", SUM(3));
}
In questo caso, definisco SUM come una chiamata per riassumere con il secondo argomento default è 5.
Se si chiama con 2 argomenti (prima chiamata in main), sarebbe preelaborato come: sum (3, (5, 7));
Ciò significa:
- 1 argomento è 3
- secondo argomento è il risultato della sequenza (5, 7) che è ... ovviamente 7!
Poiché gcc è intelligente, questo non ha alcun effetto sul runtime in quanto il primo membro della sequenza è una costante e non è necessario, verrà semplicemente scartato in fase di compilazione.
Se si chiama con un solo argomento, l'estensione gcc rimuoverà il VA_ARGS E il coma principale. Quindi è preelaborato come:
somma (3, (5));
quindi il programma dà i risultati attesi:
10
8
Quindi, ciò non perfettamente simulare (con usuali limitazioni macro) una funzione con 2 argomenti, l'ultima delle quali è facoltativo con un valore predefinito applicata se non fornito.
No, non supporta nessuno di questi. – Artefacto