Bagikan melalui


Makro variadik

Makro variadik adalah makro seperti fungsi yang berisi jumlah variabel argumen.

Keterangan

Untuk menggunakan makro variadik, elipsis dapat ditentukan sebagai argumen formal akhir dalam definisi makro, dan pengidentifikasi __VA_ARGS__ pengganti dapat digunakan dalam definisi untuk menyisipkan argumen tambahan. __VA_ARGS__ digantikan oleh semua argumen yang cocok dengan elipsis, termasuk koma di antaranya.

Standar C menentukan bahwa setidaknya satu argumen harus diteruskan ke elipsis untuk memastikan makro tidak diselesaikan ke ekspresi dengan koma berikutnya. Implementasi Microsoft C++ tradisional menekan koma berikutnya jika tidak ada argumen yang diteruskan ke elipsis. /Zc:preprocessor Saat opsi pengompilasi diatur, koma berikutnya tidak ditekan.

Contoh

// 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

Baca juga

Makro (C/C++)