gpt4 book ai didi

c - 定义函数宏

转载 作者:太空宇宙 更新时间:2023-11-04 01:15:40 25 4
gpt4 key购买 nike

海湾合作委员会 4.4.1 C99

我已经编写了一个函数,用于向用户显示消息。这工作正常,我需要它具有可扩展性,因为稍后我将添加更多错误代码。

但是,输入将是优先级、error_code 和错误的简短描述。我已经包含了函数和行号。

但是,我想将函数调用包装到一个宏中,但不确定该怎么做?

谁能指出我的写作方向?

非常感谢您的任何建议,

#include <stdio.h>
#include <stdarg.h>

typedef enum
{
ST_BIND_ERR = 1,
ST_SOCK_ERR,
ST_CONNECT_ERR,
ST_ACCEPT_ERR
}error_codes;

typedef enum
{
ST_CRITICAL = 1,
ST_WARNING,
ST_DEBUG,
ST_INFO
}priority;

#define REPORT(prio, err, msg) /* Defining macro here */

void report_msg(int prio, int err, const char *fmt, ...);

int main(void)
{
printf("=== Starting program ===\n");

report_msg(ST_WARNING, ST_CONNECT_ERR, "Error trying to make connection : FUNCTION [ %s ] : LINE [ %d ]",
__func__, __LINE__);

return 0;
}

void report_msg(int prio, int err, const char *fmt, ...)
{
va_list ap;
char priority_msg[512] = {0};
char error_code[256] = {0};
char format[256] = {0};
char output_msg[256] = {0};

switch(prio)
{
case ST_CRITICAL:
sprintf(priority_msg, "[ ST_CRITICAL ]");
break;

case ST_WARNING:
sprintf(priority_msg, "[ ST_WARNING ]");
break;

case ST_DEBUG:
sprintf(priority_msg, "[ ST_DEBUG ]");
break;

case ST_INFO:
sprintf(priority_msg, "[ ST_INFO ]");
break;

default:
sprintf(priority_msg, "[ UNKNOWN_PRIO ]");
break;
}

switch(err)
{
case ST_BIND_ERR:
sprintf(error_code, "[ ST_BIND_ERR ]");
break;

case ST_SOCK_ERR:
sprintf(error_code, "[ ST_SOCK_ERR ]");
break;

case ST_CONNECT_ERR:
sprintf(error_code, "[ ST_CONNECT_ERR ]");
break;

case ST_ACCEPT_ERR:
sprintf(error_code, "[ ST_ACCEPT_ERR ]");
break;

default:
sprintf(error_code, "[ UNKNOWN_ERR ]");
break;
}

va_start(ap, fmt);
vsprintf(format, fmt, ap);
va_end(ap);

sprintf(output_msg,"%s %s %s", priority_msg, error_code, format);

fprintf(stderr, output_msg);
}

最佳答案

C99 支持 vararg macros ,您似乎可以使用它来使其更方便:

#define REPORT(prio, err, format, ...) report_msg(prio, err, format, __VA_ARGS__)

不过,与仅调用函数相比,这实际上似乎并没有节省那么多工作。也许您应该重新定义 REPORT 宏以包含优先级或其他内容?

关于c - 定义函数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1742677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com