【问题标题】:c++ call fmt Libary from C Code with va_argsc++ 使用 va_args 从 C 代码调用 fmt 库
【发布时间】:2021-05-04 12:06:17
【问题描述】:

我想将 fmt 库用作调试框架的一部分。 但是我们的项目是混合 c 和 c++。

fmt 与 c++ 配合得很好,但在 c 中我们有 printf() 之类的格式字符串。

//c readable header
#ifdef __cplusplus
extern "C"
{
#endif

  void Foo(char* format, ...);

#ifdef __cplusplus
}
#endif
//impl.cpp
void Foo(char* format, ...)
{
  va_list aptr;

   va_start(aptr, format);

   //pass aptr to fmt lib somehow

   va_end(aptr);

}

因此,我必须从 C 代码中“隐藏”C++ 部分。 c 中如何进行格式化的唯一方法(我知道)是使用 va_args。但是它们不适用于 fmt 模板,因为第一个模板在运行时执行,另一个在编译时执行

=>所以问题 你知道如何使用 C 代码中的 fmt 库吗?

感谢您的输入 :)

【问题讨论】:

    标签: c++ c fmt


    【解决方案1】:

    您可以通过使用dynamic_format_arg_store 在运行时构造参数列表的包装器从C 调用格式化函数。但是,要使其工作,您需要了解所有参数类型,因此它不适用于不保留类型信息的可变参数。

    【讨论】:

    • 您好,谢谢您的回答。但是你能帮帮我吗?我的 C 兼容调用看起来像 UseFmtLib("Some {} text {}, "dummy", 2); 实现看起来像这样 void UseFmtLib(const char* format, ...) { va_list aptr; va_start(aptr, format); //can I pass aptr to vformat? //or can i use fmt::dynamic_format_arg_store<fmt::format_context> store(aptr); std::string result = fmt::vformat(format, aptr); va_end(aptr); }
    • 你不能使用 aptr 因为 va_list 不包含任何类型信息。
    • 呃该死的。我担心你可能会说:O 谢谢你的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多