C позволяет написать функцию с переменным номером аргумента , таким как printf
.
С учетом вышесказанного, нет надежного кроссплатформенного способав C написать функцию, которая принимает ровно 2 или 3 аргумента;в общем случае вы должны сделать что-то вроде
some_function(5, 6, 7, NULL);
some_function(5, 6, 8, 2, 5, NULL);
Другими словами, у вас должен быть завершающий аргумент "sentinal".В качестве альтернативы, вы могли бы как-то включить число параметров в более ранний параметр, такой как
another_func(2, "hello", "world");
another_func(3, "goodbye", "cruel", "world");
Семейство функций printf
использует этот подход;первый параметр формата содержит количество необходимых дополнительных параметров;например, с printf("%f %f", 5.6, 7.11)
вы знаете, что должно быть 2 параметра с плавающей точкой.Тем не менее, это было бы несколько небезопасно в пользовательской библиотечной функции, так как если бы вы сказали my_printf("%s %f %f %f %s", 5.6)
, то вы могли бы получить segfaults или еще хуже.К счастью, большинство компиляторов Си проверяют ваши вызовы printf
во время компиляции, чтобы избежать такого рода проблем.
В случае open
функция объявляется как имеющая переменные аргументы, а третий параметрпроверяется только если установлено O_CREAT
.Так вот как он «безопасно» определяет наличие третьего аргумента.Я помещаю «безопасно» в кавычки, потому что технически нет возможности открыть во время выполнения, сколько параметров было фактически передано.Например, следующие вызовы будут компилироваться без каких-либо ошибок или предупреждений:
open("foo.txt", 5, "not an integer", 7); // extra and invalid parameters
open("bar.txt", O_CREAT); // third parameter is missing