c функциональный макрос со списком аргументов, но без списка замен? - PullRequest
2 голосов
/ 16 февраля 2012

Сотрудник попросил меня объяснить немного кода на C в memcached . Я нахожусь в точке, где я признаю, что я тоже не понимаю.

Это относится к определениям макросов, подобным функциям C, с параметрами, которые также не имеют списка замены. Например, начиная со строки 2751 в memcached.c:

            if (return_cas)
            {
              MEMCACHED_COMMAND_GET(c->sfd, ITEM_key(it), it->nkey,
                                    it->nbytes, ITEM_get_cas(it));
              /* Goofy mid-flight realloc. */
              if (i >= c->suffixsize) {
                char **new_suffix_list = realloc(c->suffixlist,
                                       sizeof(char *) * c->suffixsize * 2);
                if (new_suffix_list) {
                    c->suffixsize *= 2;
                    c->suffixlist  = new_suffix_list;

MEMCACHED_COMMAND_GET () определяется в строке 23 в trace.h:

#define MEMCACHED_COMMAND_GET(arg0, arg1, arg2, arg3, arg4)

Определение макроса как функция с аргументами, ок. Нет списка замены.

Вывод cpp в memcached.c показывает, что подобный функции макрос превращается в ';':

# 2751 "memcached.c"
            if (return_cas)
            {
              ;


              if (i >= c->suffixsize) {
                char **new_suffix_list = realloc(c->suffixlist,
                                       sizeof(char *) * c->suffixsize * 2);
                if (new_suffix_list) {
                    c->suffixsize *= 2;
                    c->suffixlist = new_suffix_list;

Есть ли у кого-нибудь понимание, почему программист должен включать функциональные макросы без списка замены, такого как MEMCACHED_COMMAND_GET (), который не влияет на создаваемый код? Какую цель служит этим? Заранее благодарим.

Ответы [ 2 ]

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

В Solaris и Mac OSX он заменен на запуск зонда DTrace, поэтому он расширяется до чего-то другого.

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

Это может быть связано с проблемами переносимости: фрагмент кода, который, например, актуален для BSD, но не для Linux. Или наоборот.

Я не могу рассказать о конкретной ситуации здесь, но это может быть причиной.

...