将接收到的可变数量的参数传递给另一个函数
Pass variable number of arguments received to another function
在你说重复之前,我已经读过这个: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 文件。
那么,有什么办法可以实现吗?
如果您无法更改代码并且没有 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)
您不能使用标准 C 提供的功能编写将其可变参数列表转发给另一个可变参数函数的函数。确实,vfprintf
的存在正是因为这是不可能的。 (正如 esm 的回答中所讨论的,宏 可以做到这一点。)
如果可以选择其他第三方库,libffi may be persuadable to do what you want. (How does libffi work, you ask? Hand-written assembly language。)
在你说重复之前,我已经读过这个: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 文件。
那么,有什么办法可以实现吗?
如果您无法更改代码并且没有 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)
您不能使用标准 C 提供的功能编写将其可变参数列表转发给另一个可变参数函数的函数。确实,vfprintf
的存在正是因为这是不可能的。 (正如 esm 的回答中所讨论的,宏 可以做到这一点。)
如果可以选择其他第三方库,libffi may be persuadable to do what you want. (How does libffi work, you ask? Hand-written assembly language。)