首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在32位和64位程序中使用std::with::rep with printf

在32位和64位程序中使用std::with::rep with printf
EN

Stack Overflow用户
提问于 2017-08-31 11:40:35
回答 6查看 9.2K关注 0票数 9

有这样的代码:

代码语言:javascript
复制
#include <cstdio>
#include <chrono>

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

当以64位模式编译时,就会有一个警告:

main.cpp:在函数‘int():main.cpp:7:19: format’%lld‘期望类型为’long long int‘的参数,但参数2的类型是’long int‘-Wformat= printf("%lld",d);

在32位模式编译(带有-m32标志)时,不存在此警告。看起来std::chrono::duration::rep在64位程序中是long int类型,在32位程序中是long long int类型。

是否有一种可移植的方法像%zu说明符那样打印size_t

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-08-31 11:48:39

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

代码语言:javascript
复制
#include <cstdio>
#include <chrono>
#include <cinttypes>

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

Stack Overflow用户

发布于 2017-08-31 11:42:52

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

但是,如果必须使用printf,则更改以下内容:

代码语言:javascript
复制
printf("%lld", d);

对此:

代码语言:javascript
复制
#include <cinttypes>
printf("%" PRId64 "", d); 

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

代码语言:javascript
复制
printf("%lld", static_cast<long long int>(d));
票数 4
EN

Stack Overflow用户

发布于 2017-08-31 11:45:54

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

代码语言:javascript
复制
#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更好

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45980608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档