【问题标题】:Pass variable number of arguments received to another function将收到的可变数量的参数传递给另一个函数
【发布时间】:2015-06-29 20:13:07
【问题描述】:

在你说它是重复的之前,我已经阅读了这个: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 文件。

那么,有什么办法可以做到吗?

【问题讨论】:

  • 有没有等价的功能log_function(t_log* logger, const char* message_template, va_list args);
  • @iharob 不,没有:(
  • 我认为那是不可能的。
  • @iharob 如果你必须让这样的函数成为线程安全的,你会怎么做?
  • log_function() 是做什么的?

标签: c function arguments ansi-c


【解决方案1】:

如果您无法更改代码并且没有 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)

【讨论】:

  • 仅供参考,只有 , ## __VA_ARGS__ 构造允许传递作为 GCC 扩展的 zero 变量参数。 __VA_ARGS__ 本身就是标准的 C99。
  • @zwol 感谢您的发现,我已将答案更新为更具体。
  • 成功了!我刚刚删除了前两个参数的类型,因为它们不是必需的,也不能有指针。谢谢!!
  • @PabloMatíasGomez 感谢您对类型的了解,我很高兴它成功了。
  • @PabloMatíasGomez 允许您将宏与 if 一起使用是一个常见的技巧。见stackoverflow.com/questions/154136/…stackoverflow.com/questions/257418/…
【解决方案2】:

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

如果可以选择其他第三方库,libffi 可能会被说服去做你想做的事。 (你问 libffi 是如何工作的?Hand-written assembly language。)

【讨论】:

    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多