2012-06-05 213 views
1

我有一個可變長度參數調試日誌打印功能的問題。我將在這裏模擬代碼。我可以使用兩級可變長度參數函數嗎?

void SecondPrint(int level, const char* format,...) 
{ 
    //Printing the log here 
    va_list arg; 
    va_start(arg, format); 
    vprintf(format, arg); 
    va_end(arg); 
} 

void FirstPrint(int level, const char* format,...) 
{ 
    SecondPrint(level,format); 
} 

void main() 
{ 
    int level = 100; 
    FirstPrintf("Log level = %d message = %s \n",level,"Error message"); 
} 

「SecondPrint」應該打印出「100錯誤消息」如預期,但它不是像印刷,其印刷的「錯誤消息」。

我不明白這個問題。我懷疑從「FirstPrint」功能調用「SecondPrint」的方式。 FirstPrint通過...接收剩餘的參數,但它調用帶有級別和格式參數的SecondPrint。

我無法直接使用來自main的SecondPrint。 我必須使用FirstPrint並且FirstPrint必須調用SecondPrint才能打印日誌。所以我怎樣才能做到這一點..我想使用VA_ARGS但它只是宏定義不在函數定義。

還有一件事我做不到像* 的#define FirstPrint(A,B,...)SecondPrint(A,B,...) *

任何幫助是高度感謝提前感謝。

回答

3

C可變參數不能被設計爲通過多個級別;所需的堆棧操作類型對語言來說太深刻了。通常情況下,在這樣的情況下,你將有一個版本SecondPrint analagous來vprintf - SecondPrintV或相似的,你將有FirstPrint提取可變參數,而不是直接調用SecondPrint(和一致性後調用SecondPrintV,通常有SecondPrint內部調用SecondPrintV)。

1

你需要傳遞一個va_listSecondPrint,所以它可以訪問參數FirstPrint

void SecondPrint(int level, const char* format, va_list args) 
{ 
    //Printing the log here 
    vprintf(format, arg); 
} 

void FirstPrint(int level, const char* format,...) 
{ 
    va_list args; 
    va_start(args, format); 
    SecondPrint(level, format, args); 
    va_end(args); 
} 

void main() 
{ 
    int level = 100; 
    FirstPrintf("Log level = %d message = %s \n",level,"Error message"); 
} 
1

也許可以做到在特定的平臺特定的方式,或者(因爲參數是完全相同的順序)使用程序集來將「當前函數框架」替換爲要調用的函數。 GCC也有an extension__builtin_apply_args()__builtin_apply()函數(雖然你必須以某種方式計算出如何計算堆棧參數數據的大小)。

相關問題