Variadic makroları
Değişen sayıda bağımsız değişken içeren makrolar, değişken sayıda bağımsız değişken içeren işlev benzeri makrolardır.
Açıklamalar
Variadic makroları kullanmak için, üç nokta bir makro tanımında son resmi bağımsız değişken olarak belirtilebilir ve ek bağımsız değişkenleri eklemek için tanımda değiştirme tanımlayıcısı __VA_ARGS__
kullanılabilir. __VA_ARGS__
, aralarında virgüller de dahil olmak üzere üç noktayla eşleşen tüm bağımsız değişkenlerle değiştirilir.
C Standardı, makronun sondaki virgülle bir ifadeye çözümlenmediğinden emin olmak için üç noktaya en az bir bağımsız değişkenin geçirilmesi gerektiğini belirtir. Geleneksel Microsoft C++ uygulaması, üç noktaya bağımsız değişken geçirilmemesi durumunda sondaki virgülleri bastırır. /Zc:preprocessor
Derleyici seçeneği ayarlandığında, sondaki virgül gösterilmez.
Örnek
// 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