Sin embargo, encontré un "truco" para hacerlo si usa GCC.
GCC tiene una práctica extensión ## en variadic macro que le permite simular un argumento predeterminado.
El truco tiene sus limitaciones: funciona solo para 1 valor predeterminado, y el argumento debe ser el último de los parámetros de la función.
Aquí hay un ejemplo de trabajo.
#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));
}
En este caso, defino SUM como una llamada a la suma con el segundo argumento predeterminado es 5.
Si llama con 2 argumentos (primera llamada en main), sería preprocesado como: sum (3, (5, 7));
Esto significa:
- primera argumento es 3
- segundo argumento es el resultado de la secuencia (5, 7) ... que es, obviamente, 7!
Como gcc es inteligente, esto no tiene efecto en el tiempo de ejecución ya que el primer miembro de la secuencia es una constante y no es necesario, simplemente se descartará en tiempo de compilación.
Si llama con un solo argumento, la extensión gcc eliminará VA_ARGS Y coma principal. Entonces es preprocesado como:
suma (3, (5));
Así, el programa da el resultado esperado:
10
8
Por lo tanto, esto perfectamente simular (con las limitaciones macro habituales) una función con 2 argumentos, siendo la última opcional con un valor por defecto se aplica si no se previsto.
No, no admite nada de eso. – Artefacto