2015-06-29 44 views
2

你說這是重複之前,我已經看過這樣的:How to pass variable number of arguments from one function to another?通可變的參數個數

我有這樣的功能:

void tlog_function(t_log* logger, const char* message_template, ...) { 
    pthread_mutex_lock(&loggerLock); 
    log_function(logger, message_template, ...); // What I want to do.. 
    pthread_mutex_unlock(&loggerLock); 
} 

而另一個這樣的功能,這是不是我的,我用它從第三方庫:

void log_function(t_log* logger, const char* message_template, ...); 

正如你所看到的,我想要做的僅僅是一個互斥添加此功能,使其線程安全的,我知道我可以使用va_list,但在這種情況下,我無法更改第二個函數的代碼,因爲它位於庫中,而我只有.h文件。

那麼,有什麼辦法可以做到這一點?

+1

是否有任何等效函數'log_function(t_log * logger,const char * message_template,va_list args);'? –

+0

@iharob不,沒有:( –

+0

我不認爲它是可能的然後 –

回答

6

如果你不能改變代碼,並且沒有va_list版本的庫函數,你可以使用我知道的最接近的東西是使用宏和##__VA_ARGS__which is a GCC only extension)。

你會想是這樣的:

#define tlog_function(logger, message_template, ...) do { \ 
    pthread_mutex_lock(&loggerLock);           \ 
    log_function(logger, message_template, ##__VA_ARGS__);     \ 
    pthread_mutex_unlock(&loggerLock);          \ 
} while(0) 
+1

僅供參考,'###_VA_ARGS__'構造允許傳遞*零*可變參數是一個GCC擴展名,'__VA_ARGS__'本身就是標準的C99 – zwol

+0

@zwol感謝您的支持我已經更新了我的答案以獲得更具體的結果 – missimer

+0

它工作正常! e前兩個參數的類型,因爲它們不是必需的,也不能有指針。謝謝 !! –

2

你不能寫它的變量參數列表轉發到與事實上的標準下提供的設施另一個可變參數函數的函數,vfprintf恰恰存在,因爲這不是可能。 (如ESM的回答討論的,可以做到這一點。)

如果額外的第三方庫是一種選擇,libffi可說服的,做你想做的。 (如何使用libffi工作,你問?Hand-written assembly language。)