কম্পিউটার টিউটোরিয়াল

সি ভাষায় ম্যাক্রোতে ভেরিয়েবল লেন্থ আর্গুমেন্ট (Variadic Macros)

সি-তে ফাংশনের মতোই ম্যাক্রোতে ভেরিয়েবল সংখ্যক আর্গুমেন্ট নেওয়া যায়। এর জন্য ... (এলিপসিস) এবং __VA_ARGS__ ব্যবহার করা হয়। কনক্যাটেনেশন অপারেটর ## দিয়ে আর্গুমেন্টগুলো একসাথে জোড়া দেয়া হয়।

সিনট্যাক্স

#define MACRO_NAME(param, ...)  do { ... __VA_ARGS__ ... } while(0)
  • __VA_ARGS__: ভেরিয়েবল আর্গুমেন্টগুলোকে রিপ্রেজেন্ট করে
  • ##__VA_ARGS__: যদি কোনো আর্গুমেন্ট না থাকে তবে কমা (,) রিমুভ করে (GCC এক্সটেনশন)
  • do { ... } while(0): ম্যাক্রোকে সেফ ব্লকে বাঁধার ইডিওম

উদাহরণ: লগিং ম্যাক্রো

#include <stdio.h>

#define INFO 1
#define ERR  2
#define STD_OUT stdout
#define STD_ERR stderr

#define LOG_MESSAGE(pr, strm, msg, ...) \
    do { \
        char *str; \
        if (pr == INFO) \
            str = "INFORMATION"; \
        else if (pr == ERR) \
            str = "ERROR"; \
        fprintf(strm, "[%s] : %s : %d : " msg "\n", \
                str, __FILE__, __LINE__, ##__VA_ARGS__); \
    } while (0)

int main(void) {
    char *s = "Test String";
    LOG_MESSAGE(ERR, STD_ERR, "Unable to open the file");
    LOG_MESSAGE(INFO, STD_OUT, "%s is passed as argument", s);
    LOG_MESSAGE(INFO, STD_OUT, "%d + %d = %d", 14, 16, (14 + 16));
    return 0;
}

আউটপুট

[ERROR] : D:\text.c : 21 : Unable to open the file
[INFORMATION] : D:\text.c : 23 : Test String is passed as argument
[INFORMATION] : D:\text.c : 25 : 14 + 16 = 30

ব্যাখ্যা

  • __FILE__ এবং __LINE__ প্রিপ্রসেসর ম্যাক্রো — ফাইল নাম এবং লাইন নম্বর দেয়
  • ##__VA_ARGS__ ব্যবহার করা হয়েছে যাতে কোনো এক্সট্রা আর্গুমেন্ট না থাকলে কমা-রিলেটেড এরর নাও হয়
  • do-while(0) ব্লক ম্যাক্রোকে সেমিকোলন দিয়ে এক স্টেটমেন্টর মতো ব্যবহার করতে দেয়

স্ট্যান্ডার্ড নোট

  • C99 স্ট্যান্ডার্ড থেকে __VA_ARGS__ সাপোর্ট করা হয়
  • C23-এ __VA_OPT__ এড হয়েছে আরও ফ্লেক্সিবিলিটির জন্য
  1. C++ প্রোগ্রামে ডায়াগোনাল দৈর্ঘ্য দিয়ে হেক্সাগনের ক্ষেত্রফল

  2. Matplotlib-এ ভেরিয়েবল লেন্থ ডেটা দিয়ে বক্সপ্লট (Boxplot)

  3. পাইথনে ১D লিস্টকে ভেরিয়েবল দৈর্ঘ্যের ২D লিস্টে কনভার্ট করা

  4. পাইথনে কমান্ড লাইন এবং ভেরিয়েবল আর্গুমেন্ট