C语言 如何在宏定义中使用可变参数-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

2016-06-03 19:32:05 2668 1

有一个记录日志的函数,想用宏定义进行包装,简化调用方法,但是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.

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:27:10
    #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);
        }
    }
    0 0
相关问答

1

回答

C语言宏定义 取前两个字节问题?报错

2020-06-14 20:33:53 345浏览量 回答数 1

1

回答

C语言中有类似foreach的函数吗?

2022-04-03 13:06:41 1155浏览量 回答数 1

1

回答

C语言static函数与普通函数有什么区别?

2022-04-02 14:44:54 445浏览量 回答数 1

1

回答

在C语言中,结构体可以包含函数吗?

2022-03-31 15:32:48 770浏览量 回答数 1

1

回答

C语言中一个函数的所有组成部分分别有什么呀?

2022-03-30 08:52:31 216浏览量 回答数 1

1

回答

在c语言里函数指针和函数名的区别是什么呀?

2022-03-30 03:12:33 269浏览量 回答数 1

1

回答

在C语言中,如何使用void指针作为函数返回类型?

2022-03-30 02:53:46 261浏览量 回答数 1

1

回答

在使用C语言的函数指针变量是需要注意哪些内容呢?

2022-03-29 23:19:07 215浏览量 回答数 1

1

回答

C语言的函数一般是什么呢?

2022-03-29 23:02:05 177浏览量 回答数 1

1

回答

C语言中strcat函数是什么意思?

2022-03-29 22:21:48 309浏览量 回答数 1
+关注
文章
问答
问答排行榜
最热
最新
相关课程
更多
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载