Рубрики

Аргументы переменной длины для макросов

Как и функции, мы также можем передавать аргументы переменной длины в макросы. Для этого мы будем использовать следующие идентификаторы препроцессора.

Чтобы поддерживать аргументы переменной длины в макросе, мы должны включить эллипсы (…) в определение макроса. Существует также идентификатор предварительной обработки «__VA_ARGS__», который заботится о подстановках аргументов переменной длины, которые предоставляются макросу. Оператор конкатенации ## (он же оператор вставки) используется для конкатенации переменных аргументов.

Давайте посмотрим на примере. Ниже макрос принимает аргумент переменной длины, например, функцию «printf ()». Этот макрос предназначен для регистрации ошибок. Макрос печатает имя файла, за которым следует номер строки, и, наконец, печатает информацию / сообщение об ошибке. Первые аргументы «prio» определяют приоритет сообщения, то есть, является ли это информационным сообщением или ошибкой, «поток» может быть «стандартным выводом» или «стандартной ошибкой». Он отображает сообщения INFO в stdout и сообщения ERROR в потоке stderr.

#include <stdio.h>

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

  
#define LOG_MESSAGE(prio, stream, msg, ...) do {\

                        char *str;\

                        if (prio == INFO)\

                            str = "INFO";\

                        else if (prio == ERR)\

                            str = "ERR";\

                        fprintf(stream, "[%s] : %s : %d : "msg" \n", \

                                str, __FILE__, __LINE__, ##__VA_ARGS__);\

                    } while (0)

  

int main(void)

{

    char *s = "Hello";

  

        / * показать обычное сообщение * /

    LOG_MESSAGE(ERR, STD_ERR, "Failed to open file");

  

    / * предоставить строку в качестве аргумента * /

    LOG_MESSAGE(INFO, STD_OUT, "%s Geeks for Geeks", s);

  

    / * предоставить целое число в качестве аргументов * /

    LOG_MESSAGE(INFO, STD_OUT, "%d + %d = %d", 10, 20, (10 + 20));

  

    return 0;

}

Скомпилируйте и запустите вышеуказанную программу, она выдаст нижеприведенный результат.

  [narendra@/media/partition/GFG]$ ./variable_length 
  [ERR] : variable_length.c : 26 : Failed to open file 
  [INFO] : variable_length.c : 27 : Hello Geeks for Geeks 
  [INFO] : variable_length.c : 28 : 10 + 20 = 30 
  [narendra@/media/partition/GFG]$

Эта статья составлена Нарендрой Кангралкар . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Аргументы переменной длины для макросов

0.00 (0%) 0 votes