C语言 如何在宏定义中使用可变参数

发布于 2022-08-24 23:43:56 字数 1829 浏览 34 评论 0

有一个记录日志的函数,想用宏定义进行包装,简化调用方法,但是xlc报如下的错误:

void _log(const int level, char* file, int line, const char* fmt, ...){
	va_list ap;
	int count;
	time_t t;
	struct tm* st;
	char str_time[255];
	memset(str_time, 0x00, sizeof(str_time));
	time(&t);
	st= localtime(&t);
	switch(level){
		case DEBUG:
				fprintf(stdout, "[DEBUG]	");
				break;
		case INFO:
				fprintf(stdout, "[INFO]	");
				break;
		case WARNING:
				fprintf(stdout, "[WARNING]	");
				break;
		case ERROR:
				fprintf(stdout, "[ERROR]	");
				break;
		default:
				fprintf(stdout, "[INFO]	");
				break;
	}
	strftime( str_time, sizeof(str_time), "%Y-%m-%d %H:%M:%S", st);
	fprintf(stdout, "[%s] LINE:[%04d] [%s] ", file, line, str_time);
	va_start(ap, fmt);
	count = vfprintf(stdout, fmt, ap);
	fprintf(stdout, "\n");
	fflush(stdout);
	va_end(ap);
}


#define log_info(...) _log((INFO), (__FILE__), (__LINE__), "", (#__VA_ARGS__))
#define log_err(...) _log((ERROR), (__FILE__), (__LINE__), "", (#__VA_ARGS__))
Syntax error at line 71, column 18, file RProCrminfo.cp:

Error at line 71, column 18 in file RProCrminfo.cp

  • define log_info((aaa), ...) _log((INFO), (__FILE__), (__LINE__), "", (#__VA_ARG

S__))
.................1
PCC-S-02014, Encountered the symbol "(" when expecting one of the following:

) ... an identifier, define, elif, else, endif, error, if,
ifdef, ifndef, include, line, pragma, undef, exec, sql,
begin, end, var, type, oracle,
an immediate preprocessor command, a C token, create,
function, package, procedure, trigger, or, replace,
The symbol ")" was substituted for "(" to continue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

┼── 2022-08-31 23:43:56

早先一个项目woj-land里用到的,供参考

#define FM_LOG_DEBUG(x...)   log_write(LOG_DEBUG, __FILE__, __LINE__, ##x)

static void log_write(int level, const char *file,
        const int line, const char *fmt, ...)
{
    if (log_opened == 0)
    {
        fprintf(stderr, "log_open not called yet\n");
        exit(1);
    }
    static char buffer[log_buffer_size];
    static char datetime[100];
    static char line_str[20];
    static time_t now;
    now = time(NULL);

    strftime(datetime, 99, "%Y-%m-%d %H:%M:%S", localtime(&now));
    snprintf(line_str, 19, "%d", line);
    va_list ap;
    va_start(ap, fmt);   
    vsnprintf(log_buffer, log_buffer_size, fmt, ap);   
    va_end(ap);   

    size_t count = snprintf(buffer, log_buffer_size,
            "%s\x7 [%s]\x7 [%s:%d]%s\x7 %s\x7\n", 
            LOG_LEVEL_NOTE[level], datetime, file, line, log_extra_info, log_buffer);
    int log_fd = log_fp->_fileno;
    //puts(buffer);
    if (flock(log_fd, LOCK_EX) == 0)
    {
        if (write(log_fd, buffer, count) < 0)
        {
            perror("write error");
            exit(1);
        }
        flock(log_fd, LOCK_UN);
    }
    else
    {
        perror("flock error");
        exit(1);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文