Passing variable number of arguments around

前端 未结 11 630
我寻月下人不归
我寻月下人不归 2020-11-22 07:16

Say I have a C function which takes a variable number of arguments: How can I call another function which expects a variable number of arguments from inside of it, passing a

11条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-22 07:49

    Short answer

    /// logs all messages below this level, level 0 turns off LOG 
    #ifndef LOG_LEVEL
    #define LOG_LEVEL 5  // 0:off, 1:error, 2:warning, 3: info, 4: debug, 5:verbose
    #endif
    #define _LOG_FORMAT_SHORT(letter, format) "[" #letter "]: " format "\n"
    
    /// short log
    #define log_s(level, format, ...)     \                                                                                  
        if (level <= LOG_LEVEL)            \                                                                                     
        printf(_LOG_FORMAT_SHORT(level, format), ##__VA_ARGS__)
    
    

    usage

    log_s(1, "fatal error occurred");
    log_s(3, "x=%d and name=%s",2, "ali");
    

    output

    [1]: fatal error occurred
    [3]: x=2 and name=ali
    

    log with file and line number

    const char* _getFileName(const char* path)
    {
        size_t i = 0;
        size_t pos = 0;
        char* p = (char*)path;
        while (*p) {
            i++;
            if (*p == '/' || *p == '\\') {
                pos = i;
            }
            p++;
        }
        return path + pos;
    }
    
    #define _LOG_FORMAT(letter, format)      \                                                                        
        "[" #letter "][%s:%u] %s(): " format "\n", _getFileName(__FILE__), __LINE__, __FUNCTION__
    
    #ifndef LOG_LEVEL
    #define LOG_LEVEL 5 // 0:off, 1:error, 2:warning, 3: info, 4: debug, 5:verbose
    #endif
    
    /// long log
    #define log_l(level, format, ...)     \                                                                               
        if (level <= LOG_LEVEL)            \                                                                                         
        printf(_LOG_FORMAT(level, format), ##__VA_ARGS__)
    

    usage

    log_s(1, "fatal error occurred");
    log_s(3, "x=%d and name=%s",2, "ali");
    

    output

    [1][test.cpp:97] main(): fatal error occurred
    [3][test.cpp:98] main(): x=2 and name=ali
    

    custom print function

    you can write custom print function and pass ... args to it and it is also possible to combine this with methods above. source from here

    int print_custom(const char* format, ...)
    {
        static char loc_buf[64];
        char* temp = loc_buf;
        int len;
        va_list arg;
        va_list copy;
        va_start(arg, format);
        va_copy(copy, arg);
        len = vsnprintf(NULL, 0, format, arg);
        va_end(copy);
        if (len >= sizeof(loc_buf)) {
            temp = (char*)malloc(len + 1);
            if (temp == NULL) {
                return 0;
            }
        }
        vsnprintf(temp, len + 1, format, arg);
        printf(temp); // replace with any print function you want
        va_end(arg);
        if (len >= sizeof(loc_buf)) {
            free(temp);
        }
        return len;
    }
    

提交回复
热议问题