#define и функции с аргументами переменной длины

Необходимо прочитать эту статью.

, Каковы наиболее распространенные антишаблоны SQL?

основной вопрос - то, что идентификаторы не все последовательны в таблице 1, таким образом, мы должны будем читать из таблицы 1 и затем вставить базирующийся идентификатора найденных в таблицу 2

Да, посмотреть на мой ответ в вышеупомянутой статье и записать, что обходящий ключ цикл с помощью Объекта № 2.

Удостоверяется, когда Вы пишете оператор вставки, Вы предоставляете cписок полей - как я говорю в Объекте № 1.

6
задан Mick 29 September 2009 в 11:03
поделиться

6 ответов

You may use C99 variadic macros:

#define my_printf(...) my_printf_(x, __VA_ARGS__)

As Microsoft's implementation suppresse trailing commas, the str argument can be added explicitly

#define my_printf(str, ...) my_printf_(x, str, __VA_ARGS__)

but this would lead to a syntax error in standard C when invoked without variadic arguments

my_printf("foo")

or an empty argument list

my_printf("foo",)

Therefore, I'd go with the first version.

7
ответ дан 8 December 2019 в 04:53
поделиться

Если код можно скомпилировать как код C99, вы можете определить вариативный макрос

#define my_printf(str, args...) _my_printf(x, str, ##__VA_ARGS__)

Препроцессор заменит аргументы ... а препроцессор GNU удалит конечную запятую. в случае, если макрос вызывается только с аргументом str.

8
ответ дан 8 December 2019 в 04:53
поделиться

Вы не можете использовать стандартные макросы C89. Однако вы можете получить тот же эффект, используя функции, разбив основную часть вашей функции my_printf на функцию vmy_printf , аналогичную стандартной vprintf :

#include <stdarg.h>

int vmy_printf(int x, const char *format, va_list ap)
{
    /* main body of my_printf goes here, taking its varargs from ap */
}

/* new_my_printf(), for callers who know about the x parameter */
int new_my_printf(int x, const char *format, ...)
{
    int n;
    va_list ap;

    va_start(ap, format);
    n = vmy_printf(x, format, ap);
    va_end(ap);

    return n;
}

/* my_printf(), for the old callers who don't know about x */
int my_printf(const char *format, ...)
{
    int n;
    va_list ap;

    va_start(ap, format);
    n = vmy_printf(DEFAULT_X, format, ap);
    va_end(ap);

    return n;
}

(Это причина того, почему эти v ... версии всех стандартных функций varargs существуют.)

2
ответ дан 8 December 2019 в 04:53
поделиться

Если my_printf уже принимает переменное количество аргументов, я не уверен, почему вам нужно заключить «еще один аргумент» в макрос ... Просто вставьте новые вызовы с дополнительным аргументом и покончить с этим; старые вызовы должны работать должным образом.

0
ответ дан 8 December 2019 в 04:53
поделиться

Простым решением этой проблемы является ...

#define my_printf(x) printf x

(обратите внимание на отсутствующие фигурные скобки)

Чтобы вызвать его, используйте:

my_printf((any number of arguments))

(обратите внимание на двойные фигурные скобки)

0
ответ дан 8 December 2019 в 04:53
поделиться

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

Тем не менее, если вы используете набор инструментов GNU, вы, возможно, можете изучить использование макросов varargs .

7
ответ дан 8 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: