Тем не менее я нашел "хитрость", чтобы сделать это, если вы используете GCC.
GCC имеет удобное расширение ## для макроса variadic, которое позволяет имитировать аргумент по умолчанию.
Трюк имеет ограничения: он работает только для 1 значения по умолчанию, а аргумент должен быть последним из параметров вашей функции.
Вот рабочий пример.
#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 ) );
}
В этом случае я определяю SUM как вызов суммы с вторым аргументом по умолчанию, равным 5.
Если вы вызываете с 2 аргументами (первый вызов в main), он будет предварительно обработан как:
сумма (3, (5, 7));
Это означает:
- 1-й аргумент - 3
- второй аргумент является результатом последовательности (5, 7) ... которая
очевидно 7!
Поскольку gcc умен, это не влияет на время выполнения, так как первый член последовательности является константой и не нужен, он просто отбрасывается во время компиляции.
Если вы вызываете только с одним аргументом, расширение gcc удалит VA_ARGS AND ведущую кому. Таким образом, он предварительно обрабатывается как:
сумма (3, (5));
Таким образом, программа выдает ожидаемый результат:
10
8
Таким образом, это прекрасно имитирует (с обычными ограничениями макросов) функцию с 2 аргументами, последний из которых является необязательным, и по умолчанию применяется значение, если оно не указано.