fmt std :: string显示为数字

时间:2019-11-27 17:10:56

标签: c++ formatting fmt

我试图格式化将在控制台中显示的简单字符串

    long long duration = end - start;

    double ms = static_cast<double>(duration) * 0.001;

    std::string resoult = fmt::format("{} => Duration: {} micro, {} ms", m_Info.c_str(), duration, ms);
    AE_TRACE(resoult);

其中m_Info为std :: string,持续时间为long long,ms为double。 结果如下: -9891888000000.0 => Duration: 49172 micro, 412316861 ms

std :: string显示为随机数,ms假定为49172。

我尝试过 "{:s} => Duration: {:d} micro, {:f} ms"

,但在fmt::format_errror中出现了。我在同一项目的其他文件中使用了相同的库,但没有得到这样的错误。

编辑

我在代码的同一部分中使用了其他一些fmt函数

    long long duration = end - start;

    double ms = duration * 0.001;

    std::string test = "test";

    fmt::memory_buffer temp;

    fmt::format_to(temp, "{} {} {}", test, duration, ms);

    AE_TRACE(fmt::format("{} {} {}", test, duration, ms));
    AE_TRACE(temp.data());
    AE_TRACE("{} {} {}"_format(test, duration, ms));
    AE_TRACE(test);

所有std::stringdouble都显示为一些随机数。 最后一个函数正确地打印了未格式化的std::string,当我尝试使用long longdouble时也是如此。

2 个答案:

答案 0 :(得分:1)

您没有提供足够的信息来调试此问题,但您的fmtlib副本和spdlog中的副本可能互不相同。 spdlog提供了一个cmake配置变量来防止这种情况发生,即(来自我的cmake文件)

set(SPDLOG_FMT_EXTERNAL ON CACHE BOOL "Use common fmtlib")

您可能想尝试一下。

答案 1 :(得分:-1)

我找到了原因。这是因为我在spdlog

之前加入了fmt

之前

#include "../log/Log.h"
#include "fmt/format.h"

之后

#include "fmt/format.h"
#include "../log/Log.h"