2013-12-08 86 views
0

我有一個函數參數的問題。我有一個函數A,它調用一個函數B.我必須寫什麼而不是?歸檔該函數將所有參數傳遞給函數B?如何將參數列表傳遞給C++中的另一個函數?

#include <iostream> 
#include <stdarg.h> 

void functionA(int a, ...); 
void functionB(int a, ...); 

int main() 
{ 
    functionA(2, 5, 13); 

    return 0; 
} 

void functionA(int a, ...) 
{ 
    functionB(a, ???); 
} 

void functionB(int a, ...) 
{ 
    va_list params; 
    va_start(params, a); 
    for(int i = 0; i<a; i++) 
    { 
     std::cout << va_arg(params, int) << std::endl; 
    } 
    va_end(params); 
} 
+1

請勿使用可變數量的參數。這是一個愚蠢的想法,而不是安全的 –

+2

你爲什麼要做意大利麪條? –

+0

你可能想查找可變參數模板。他們至少會讓你更乾淨地做到這一點(例如,不會破壞型號安全)。 –

回答

1

我不認爲你可以...做到這一點。如果您重寫functionB採取va_listvprintf那樣做,那應該工作。

1

你必須要功能,一是採取可變數量的參數,和一個採取va_list

void vunctionB(int a, va_list va) 
{ 
    ... 
} 

void functionB(int a, ...) 
{ 
    va_list va; 
    va_start(va, a); 
    functionB(a, va); 
    va_end(va); 
} 

有可能是其他可能的解決方案,以及像使用variadic templates in C++11

0

你需要設計版本的功能,其中一個valists,和一個可變參數:

void vfunctionA(int a, va_list ap) 
{ 
    // real logic 
} 

void functionA(int a, ...) 
{ 
    va_list ap; 
    va_start(ap, a); 
    vfunctionA(a, ap); 
    va_end(ap); 
} 

// same for functionB 

現在,您可以輕鬆地實現在另一個方面一個功能:

double vrandom(int x, va_list ap) 
{ 
    return vfunctionX(x, ap); 
} 

如果你檢查標準庫或Posix庫,你會發現很多例子,例如printf/vprintf,execl/execv(但不是fork/vfork!)。

相關問題