[C/C++]可變參數傳遞

    在工做中遇到一種問題,須要在可變參函數中將可變參數傳遞給另外的函數調用,因而想固然的寫了以下代碼:
函數

void vTestFun_1(const char* fmt, ...)
{
    ...
    vTestFun_2(fmt, ...);
    ...
}

void vTestFun_2(const char* fmt, ...)
{
    //TODO
}

    而後就理所固然的囧了,編譯器告訴我不能這麼用,那隻能找其餘方法了。
code

    因而,新的代碼以下:orm

void vTestFun_1(const char* fmt, va_list argp)
{
    //TODO
}

void vTestFun_2(const char* fmt, ...)
{
	va_list args;
	va_start(args, fmt);
	...
	vTestFun_1(fmt, args);
	...
	va_end(args);
}

    後來,看Log4cpp源碼的時候,發現其中也有相似這樣的函數調用:
編譯器

void Category::_logUnconditionally(Priority::Value priority, 
                                   const char* format, 
                                   va_list arguments) throw() 
{
    _logUnconditionally2(priority, StringUtil::vform(format, arguments));
}

void Category::log(Priority::Value priority, const char* stringFormat, ...) throw() 
{ 
        if (isPriorityEnabled(priority)) 
        {
            va_list va;
            va_start(va, stringFormat);
            _logUnconditionally(priority, stringFormat, va);
            va_end(va);
        }
}

    綜上,若想將可變參數進行傳遞,不能簡單的使用...來進行傳遞,這種想固然的方法直接被編譯器秒殺……一般先將可變參數...轉爲va_list,而後將va_list傳遞給其餘函數進行處理,這樣就變相實現了可變參數的傳遞。
源碼

相關文章
相關標籤/搜索