uint_fast16_t的sprintf格式?

Que*_*ner 4 c++ printf

我对uint_fast16_t的格式有问题

    uint_fast16_t runningOrderNo;

    std::string ATNativeConnector::_GetNextClOrdId()
{

    time_t t = time(NULL);
    struct tm* tim = localtime(&t);

    std::stringstream sstr;
    char temp[10];
    sprintf(temp, "%02d%02d%02d%03u", tim->tm_hour, tim->tm_min, tim->tm_sec, ++runningOrderNo);
    sstr << temp; //<< std::setfill('0') << std::setw(2) << tim->tm_hour << tim->tm_min <<  tim->tm_sec << ++runningOrderNo;
    runningOrderNo %= 999;

    //LOG4CXX_DEBUG(logger,"Generated " << sstr.str() << " second:" << tim->tm_sec << " order id");
    return sstr.str();
}
Run Code Online (Sandbox Code Playgroud)

我收到这样的警告.

ATNativeConnector.cpp:6156:95:警告:格式'%u'需要'unsigned int'类型的参数,但参数6的类型为'uint_fast16_t {aka long unsigned int}'[ - Wformat =]

我从这个页面尝试了不同的格式,如果有人会帮助我,我会感激不尽.

sth*_*sth 10

正确的方法是使用PRIuFAST16您链接的页面中的宏:

sprintf(temp, "%02d%02d%02d%03" PRIuFAST16, ..., ++runningOrderNo);
Run Code Online (Sandbox Code Playgroud)

宏扩展为一个字符串,然后由预处理器与相邻的字符串文字连接.这样,稍微奇怪的外观"%02d%02d%02d%03" PRIuFAST16最终会成为包含正确格式说明符的一个字符串文字.

  • 在宏和引号之间包含一个空格,以避免用户定义的字符串文字lexing规则出现问题.我知道有些编译器通过识别允许的字符串来解决UDL问题,但使用空格仍然是一种很好的做法. (2认同)