在32位和64位程序中使用std :: chrono :: duration :: rep和printf

时间:2017-08-31 11:40:35

标签: c++ c++11 io long-integer chrono

有这段代码:

class SplitGridLayoutManager(context : Context, rowCount : Int, val columnCount : Int)
    : GridLayoutManager(context, rowCount, GridLayoutManager.HORIZONTAL, false) {

    override fun supportsPredictiveItemAnimations() = false

    ...

}

当在64位模式下编译时,会出现警告:

#include <cstdio>
#include <chrono>

int main()
{
  auto d = std::chrono::microseconds(1).count();
  printf("%lld", d);
  return 0;
}

在32位模式下编译时使用此警告(使用-m32标志)。看起来main.cpp: In function ‘int main()’: main.cpp:7:19: warning: format ‘%lld’ expects argument of type ‘long long int’, but argument 2 has type ‘long int’ [-Wformat=] printf("%lld", d); ^ 在64位程序中属于std::chrono::duration::rep类型,在32位程序中属于long int

是否有可移植的方式来打印long long int的{​​{1}}说明符?

7 个答案:

答案 0 :(得分:9)

正如您所说,使用of std::cout不是一个选项,您可以将值转换为所需的最小数据类型 1 ,这里long long int 2 并使用相应的转换说明符:

printf("%lld", static_cast<long long int>(d));

为避免显式转换,您还可以直接使用数据类型而不是auto specifier

long long int d = std::chrono::microseconds(1).count();
printf("%lld", d);

1 对于所需的最小数据类型,我指的是可以代表两种实现中的值的最小类型。
2 long long int类型必须至少为64位宽,see here on SO

答案 1 :(得分:4)

我建议您使用std::cout,因为您使用的是C ++。这将是便携式的。

但是,如果必须使用printf,请更改:

printf("%lld", d);

到此:

#include <cinttypes>
printf("%" PRId64 "", d); 

另一种方法是将d转换为最高数据类型(可以包含两种类型),如下所示:

printf("%lld", static_cast<long long int>(d));

答案 2 :(得分:4)

您可以在打印前将其强制转换为long long int

#include <cstdio>
#include <chrono>

int main()
{
  auto d = std::chrono::microseconds(1).count();
  printf("%lld", static_cast<long long int>(d));
  return 0;
}

但似乎我最好使用std::cout

答案 3 :(得分:3)

使用固定大小的整数int64_t,而不是使用auto限定符。

#include <cstdio>
#include <chrono>
#include <cinttypes>

int main()
{
    int64_t d = std::chrono::microseconds(1).count();
    printf("%" PRId64 "\n", d);
    return 0;
}

答案 4 :(得分:2)

要考虑的便携式(即C ++)方法,不使用std :: cout

 {
   // create a string:
   std::ostringstream ss; 
   ss << d;" 
   // then
   printf("%s", ss.str().c_str());
 } 

或者

 {
   printf("%s", std::to_string(d).c_str() );
 }

答案 5 :(得分:0)

为避免出现警告,您可以将d转换为long long int。

printf("%lld", static_cast<long long int> (d));

答案 6 :(得分:0)

也许与手头的32/64位问题没有直接关系,但是我们中的一些人在具有奇数输出控制台和C ++库的嵌入式系统上。 (此外,我们知道,如果必须进行任何认真的输出格式化,则printf比iomanip还要聪明!)

无论如何,这会打印持续时间的胆量,可能对调试很有用。修改口味。

template<typename Rep, typename Ratio>
printf_dur( std::chrono::duration< Rep, Ratio > dur )
{
    printf( "%lld ticks of %lld/%lld == %.3fs",
            (long long int) dur.count(),
            (long long int) Ratio::num,
            (long long int) Ratio::den,
            ( (Ratio::num == 1LL)
              ? (float) dur.count() / (float) Ratio::den
              : (float) dur.count() * (float) Ratio::num
            )
         );
}