📜  宏的可变长度参数

📅  最后修改于: 2021-05-26 02:33:43             🧑  作者: Mango

像函数一样,我们也可以将可变长度参数传递给宏。为此,我们将使用以下预处理程序标识符。

要在宏中支持可变长度参数,我们必须在宏定义中包括省略号(…)。还有一个“ __VA_ARGS__”预处理标识符,用于处理提供给宏的可变长度参数替换。串联运算符##(也称为粘贴运算符)用于串联变量参数。

让我们来看一个例子。下面的宏采用可变长度参数,例如“ printf()”函数。该宏用于错误记录。宏打印文件名,后跟行号,最后打印信息/错误消息。第一个参数“ prio”确定消息的优先级,即是消息消息还是错误消息,“ stream”可以是“标准输出”或“标准错误”。它在stdout上显示INFO消息,在stderr流上显示ERROR消息。

#include 
  
#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";
  
        /* display normal message */
    LOG_MESSAGE(ERR, STD_ERR, "Failed to open file");
  
    /* provide string as argument */
    LOG_MESSAGE(INFO, STD_OUT, "%s Geeks for Geeks", s);
  
    /* provide integer as arguments */
    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]$
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。