2

在你说它是重复的之前,我已经读过这个:如何将可变数量的参数从一个函数传递给另一个函数?

我有这样的功能:

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 文件。

那么,有没有办法实现这一目标?

4

2 回答 2

6

如果您无法更改代码并且没有va_list库函数的版本,您可以使用我所知道的最接近的方法是使用宏和##__VA_ARGS__这是仅 GCC 的扩展)。

你会想要这样的东西:

#define tlog_function(logger, message_template, ...) do { \
    pthread_mutex_lock(&loggerLock);                                         \
    log_function(logger, message_template, ##__VA_ARGS__);                   \
    pthread_mutex_unlock(&loggerLock);                                       \
} while(0)
于 2015-06-29T20:19:55.540 回答
2

您不能使用标准 C 提供的工具编写一个将其变量参数列表转发到另一个可变参数函数的函数。确实,vfprintf它的存在正是因为这是不可能的。(正如 esm 的回答中所讨论的,可以做到这一点。)

如果可以选择额外的第三方库,libffi可能会被说服去做你想做的事。(你问 libffi 是如何工作的? 手写汇编语言。)

于 2015-06-29T20:20:27.747 回答