Необходимо прочитать эту статью.
, Каковы наиболее распространенные антишаблоны SQL?
основной вопрос - то, что идентификаторы не все последовательны в таблице 1, таким образом, мы должны будем читать из таблицы 1 и затем вставить базирующийся идентификатора найденных в таблицу 2
Да, посмотреть на мой ответ в вышеупомянутой статье и записать, что обходящий ключ цикл с помощью Объекта № 2.
Удостоверяется, когда Вы пишете оператор вставки, Вы предоставляете cписок полей - как я говорю в Объекте № 1.
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.
Если код можно скомпилировать как код C99, вы можете определить вариативный макрос
#define my_printf(str, args...) _my_printf(x, str, ##__VA_ARGS__)
Препроцессор заменит аргументы ... а препроцессор GNU удалит конечную запятую. в случае, если макрос вызывается только с аргументом str.
Вы не можете использовать стандартные макросы 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 существуют.)
Если my_printf
уже принимает переменное количество аргументов, я не уверен, почему вам нужно заключить «еще один аргумент» в макрос ... Просто вставьте новые вызовы с дополнительным аргументом и покончить с этим; старые вызовы должны работать должным образом.
Простым решением этой проблемы является ...
#define my_printf(x) printf x
(обратите внимание на отсутствующие фигурные скобки)
Чтобы вызвать его, используйте:
my_printf((any number of arguments))
(обратите внимание на двойные фигурные скобки)
Лучше всего, конечно, укусить пулю и отредактировать код. В противном случае вы создаете «загадку», которую должны разгадать все будущие разработчики кода. Даже если это только вы, это именно тот умный трюк, о котором вы забудете совсем. Отстойно возвращаться и быть озадаченным странными, кажущимися бессмысленными макросами.
Тем не менее, если вы используете набор инструментов GNU, вы, возможно, можете изучить использование макросов varargs .