如何在C中包装变差函数



我正在尝试包装一个可变函数来预先验证输入。准确地说,我需要调用sd_notifyf(int unset_environment,const char*format,…(

https://www.freedesktop.org/software/systemd/man/sd_notify.html

但在调用sd_notifyf之前,我想验证格式的输入,然后在包装函数中调用sd_nodify((。

目前我已经尝试了以下几种:

void wrapperFunc(int unset_environment, const char *format, ...) {
va_list list;
va_start(list, format);
//validation of va_args
sd_notifyf(unset_environment, format, list);
va_end(list);
}
int main(int argc, char *argv[]) {
wrapperFunc(0, "STATUS=args: '%s' : '%s'", "arg1", "arg2");
}

在实际代码中,启动服务时会调用wrapperFunc((,所以您可以理解我为什么要调用sd_notifyf((。

对于我当前的实现,在检查服务状态时会返回以下内容:STATUS=参数:"^P":"arg2">

为什么它只正确地显示了第二个论点?如何正确地包装sd_notifyf((?

代码的行为是未定义的。

sd_notifyf是变差函数,而不是以va_list作为最后参数的函数

int sd_notifyf( int unset_environment,
const char *format,
…);

恐怕您无法编写包装器函数,因为没有采用va_listsd_notify函数版本

只能使用宏定义。

#define wrapperMacro(unset_environment, format, ...)
do{
/* do some stuff */
sd_notifyf(unset_environment, format, __VA_ARGS__);
}while(0)

您也可以使用字符串printf函数(在本例中为vsnprintf(:

#define LARGE_ENOUGH_TO_ACCOMODATE_THE_STRING 64
void wrapperFunc(int unset_environment, const char *format, ...) {
va_list list;
va_start(list, format);
char buff[LARGE_ENOUGH_TO_ACCOMODATE_THE_STRING];
vsnprintf(buff, sizeof(buff), format, list);
sd_notify(unset_environment, buff);
va_end(list);
}

相关内容

  • 没有找到相关文章

最新更新