您好,匿名用户
随意问技术百科期待您的加入

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

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.

用户头像 提问 2014年 2月15日 @ Thresh 上等兵 (138 威望)
分享到:

1个回答

0 投票
 
最佳答案

早先一个项目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);
    }
}
用户头像 回复 2014年 2月15日 @ Lulu 上等兵 (293 威望)
选中 2013年 9月7日 @Thresh
提一个问题:

相关问题

0 投票
1 回复 46 阅读
用户头像 提问 2012年 12月1日 @ Kyrie 上等兵 (240 威望)
0 投票
1 回复 8 阅读
用户头像 提问 2014年 3月30日 @ Nidalee 上等兵 (346 威望)
0 投票
1 回复 34 阅读
用户头像 提问 2012年 12月1日 @ Aries 上等兵 (238 威望)
0 投票
1 回复 39 阅读
+1 投票
1 回复 28 阅读
用户头像 提问 2012年 12月1日 @ Garen 上等兵 (269 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...