Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Макросы с переменным числом аргументов напоминают собой функции и могут содержать переменное число аргументов.
Замечания
Чтобы использовать макросы variadic, многоточие может быть указано в качестве окончательного формального аргумента в определении макроса, а идентификатор замены __VA_ARGS__ может использоваться в определении для вставки дополнительных аргументов. __VA_ARGS__ заменяется всеми аргументами, которые соответствуют многоточию, включая запятые между ними.
Стандарт C указывает, что не менее одного аргумента необходимо передать в многоточие, чтобы макрос не разрешал выражение с запятой. Традиционная реализация Microsoft C++ подавляет конечную запятую, если аргументы не передаются в многоточие. Если задан параметр компилятора /Zc:preprocessor , запятая не подавляется.
Пример
// variadic_macros.cpp
#include <stdio.h>
#define EMPTY
#define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); }
#define CHECK2(x, ...) if ((x)) { printf(__VA_ARGS__); }
#define CHECK3(...) { printf(__VA_ARGS__); }
#define MACRO(s, ...) printf(s, __VA_ARGS__)
int main() {
CHECK1(0, "here %s %s %s", "are", "some", "varargs1(1)\n");
CHECK1(1, "here %s %s %s", "are", "some", "varargs1(2)\n"); // won't print
CHECK2(0, "here %s %s %s", "are", "some", "varargs2(3)\n"); // won't print
CHECK2(1, "here %s %s %s", "are", "some", "varargs2(4)\n");
// always invokes printf in the macro
CHECK3("here %s %s %s", "are", "some", "varargs3(5)\n");
MACRO("hello, world\n");
MACRO("error\n", EMPTY); // would cause error C2059, except VC++
// suppresses the trailing comma
}
here are some varargs1(1)
here are some varargs2(4)
here are some varargs3(5)
hello, world
error