Зачем кому-то определять макросы для первого параметра, включая запятую в C? - PullRequest
0 голосов
/ 10 июня 2018

Внутри ev.h из libev я нашел несколько макросов, которые кажутся странными и не могут понять:

173 # define EV_P  struct ev_loop *loop /* a loop as sole parameter in a declaration */
174 # define EV_P_ EV_P,                /* a loop as first of multiple parameters */

Автор определяет макрос EV_P_ как EV_P, и использует его в качестве первого параметрав определениях функций, подобных этому:

int  ev_run (EV_P_ int flags EV_CPP (= 0));

Интересно, почему бы просто не написать EV_P, вместо EV_P_, чтобы параметры функции выглядели более четко с запятой:

int  ev_run (EV_P, int flags EV_CPP (= 0));

Это трюк в C или есть другие причины?Не знаком с C, Google его раньше, но до сих пор нет ответов.

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Одна из причин сделать это таким образом - позволить вам скомпилировать первый параметр с помощью препроцессора.

Представьте себе ситуацию, когда ваш код должен быть скомпилирован с библиотекой X, определяющей функции, которые принимают struct ev_loop *loopв качестве первого параметра или другой библиотеки Y с функциями, которые этого не делают.В таком случае вы можете определить макрос для EV_P_, который включает запятую для библиотеки X, или условно определить его как пустую строку при компиляции кода для запуска с библиотекой Y.

0 голосов
/ 10 июня 2018

Вы можете понять, почему, если вы посмотрите на более код .

#if EV_MULTIPLICITY
struct ev_loop;
# define EV_P  struct ev_loop *loop
# define EV_P_ EV_P,
...
#else
# define EV_P void
# define EV_P_
...
#endif

Если EV_MULTIPLICITY определено как ненулевое, то вы получите дополнительный аргументна вызовы, которые включают макрос EV_P_ в начале списка аргументов.Если это не так, то вы этого не сделаете.

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

...