Как опционально передать переменные аргументы в C - PullRequest
0 голосов
/ 03 сентября 2018

Рассмотрим функцию ниже:

void foo(int n,...);

Мне нужно вызвать эту функцию, "необязательно", передав переменные аргументы.

Возможно ли это?

Примерно так:

foo(10, (bIsJobDone ? "OK" : xxx) );

Я не могу понять, что ставить вместо xxx (xxx должен преобразовываться в ничто), а также как избежать "," после 10, если мне не нужно передавать какую-либо переменную arg в foo?

Примечание: я не могу изменить подпись "foo".

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Пока вы правильно вызвали и определили вызываемую функцию (не просто ...),
вызвать его с одним или двумя параметрами, в зависимости от условия, легко:

if(bIsJobDone)
{    foo(10, "OK");
} else
{    foo(10);
}

Альтернатива, втиснуть ее в троичный оператор, возможна, но многие ее считают нечитаемой (просто вопрос мнения) и не нужна для прототипа, возвращающего пустоту, который вы показали в своем вопросе.

0 голосов
/ 03 сентября 2018

Если функция была написана для переменного числа аргументов (например, printf), то можно передать переменное количество аргументов функции.

Они работают с любым из двух шаблонов

Шаблон карты

Как и printf, ранний необязательный параметр описывает остальные параметры, которые были добавлены. Затем они соответственно извлекаются из стека.

Завершающий шаблон

Можно написать функцию для суммирования набора параметров, которые имеют некоторый механизм для обнаружения терминатора.

int sum( int first_arg, ... );

Если к функции добавлен специальный токен для правильного вызова.

Если функция была написана, чтобы принимать только фиксированное количество аргументов, вы должны передать это количество аргументов.

Это потому, что вызывающий код и вызываемый код должны согласовать, сколько стека используется. Любая разница в этом контракте приведет к неопределенному поведению, которое может привести к сбою, или ваша программа может быть использована злоумышленником.

Учитывая, что функция имеет заданное количество параметров, вам необходимо предоставить все из них.

0 голосов
/ 03 сентября 2018

Назовите это отдельно:

bIsJobDone ? foo(10, "OK") : foo(10);

...