Aracılığıyla paylaş


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

Ayrıca bkz.

Makrolar (C/C++)