C поддерживает необязательные нулевые параметры? - PullRequest
3 голосов
/ 07 февраля 2012

В Python я привык к таким вещам, как

def send_command(command, modifier = None):

, и тогда аргумент-модификатор является необязательным, а отсутствие аргумента можно отличить от аргумента 0. Есть ли подобная функциональность вC?Я неопытен в C и Googling, но не могу найти четкого объяснения того, как использовать необязательные параметры в C. Кажется, вы можете назначить их аналогично, например так:

void send_command(uint8_t command, uint8_t modifier = 0) {

, так что второйАргумент является необязательным и по умолчанию равен 0, если не используется? (Изменить: Нет, это в любом случае недопустимый C)

Но может ли функция различать send_command(SOMETHING) и send_command(SOMETHING, 0)?В идеале вторым параметром может быть любое значение uint8, включая 0.

Возможно, NULL отличается от 0?

void send_command(uint8_t command, uint8_t modifier = NULL) {

Ответы [ 5 ]

9 голосов
/ 07 февраля 2012

Возможны дополнительные параметры в C99 с переменными макросами:

#define JUST3(a, b, c, ...) (a), (b), (c)
#define FUNC(...) func(JUST3(__VA_ARGS__, 0, 0))

Теперь FUNC(x) расширяется до func((x), (0), (0)), FUNC(x,y) расширяется до func((x), (y), (0)) и т. Д.

8 голосов
/ 07 февраля 2012

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

2 голосов
/ 07 февраля 2012

Как говорили другие, C не поддерживает аргументы функций по умолчанию напрямую. Но есть способы сделать это с помощью макросов. P99 имеет удобные "мета-макросы", которые делают эту функцию относительно простой для определения. В качестве примера, чтобы избежать многократного указания второго аргумента функции pthread_mutex_init:

P99_PROTOTYPE(int, pthread_mutex_init, pthread_mutex_t*, pthread_mutexattr_t const*);
#define pthread_mutex_init(...) P99_CALL_DEFARG(pthread_mutex_init, 2, __VA_ARGS__)
P99_DECLARE_DEFARG(pthread_mutex_init, , (pthread_mutexattr_t*)0);

и сразу после использования

pthread_mutex_init(&my_mutex);

Семантика оценки аргумента по умолчанию здесь такая же, как для C ++, то есть контекст оценки аргумента по умолчанию является контекстом объявления. Существует также возможность указать это таким образом, чтобы контекст оценки был контекстом вызова макроса.

2 голосов
/ 07 февраля 2012

Как уже говорили другие, C не имеет необязательных параметров.

Что касается разницы между NULL и 0, то не так много одного .

1 голос
/ 07 февраля 2012

Язык программирования C не имеет дополнительных параметров.C ++ делает, но "мать многих современных языков программирования" C не ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...