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

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

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

2016-06-03 19:32:05 2566 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语言中使用指针时要注意的要点是哪些呢?

2022-03-29 23:38:15 161浏览量 回答数 1

1

回答

C语言中指针和指针变量之间的关系是什么?

2022-03-29 23:44:35 164浏览量 回答数 1

1

回答

为什么C语言字符串常量可以当作指针呢?

2022-03-29 21:04:24 148浏览量 回答数 1

1

回答

C语言函数返回值可以是指针吗?

2022-03-29 19:32:33 181浏览量 回答数 1

1

回答

C语言数组名和指针的区别在哪里?

2022-03-29 18:03:43 143浏览量 回答数 1

1

回答

C语言指针是什么?

2022-03-29 17:28:51 312浏览量 回答数 1

1

回答

C语言指针变量初始化指针常见错误是什么?

2022-03-29 14:50:42 239浏览量 回答数 1

1

回答

c语言中的指针是什么意思?

2022-03-28 23:55:21 153浏览量 回答数 1

1

回答

c语言 指针初始化的问题?报错

2020-06-07 16:15:52 283浏览量 回答数 1

1

回答

C语言--结构函数,函数返回指针值赋值给同类型指针,结果说表达式有问题,就一个最?400报错

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