问题

开发时遇到一个问题,同一份代码要分别编译跑在 32 位和 64 位 CPU 上,部分代码如下

uint64_t a;
char a_str[20] = {0};a = 0x1234;
sprintf(a_str, "%llu", a);

使用 64 位编译器,编译报警告:uint64_t 是 long unsigned int 类型,请使用 "%ld"
然后改成 “%ld”,使用 32 位机器编译时,又报警告了:uint64_t 是 long long unsigned int 类型,请使用 "%lld"

两者不能得兼?

解决

后来查到可以使用 PRIu64 宏,即代码改为如下:

uint64_t a;
char a_str[20] = {0};a = 0x1234;
sprintf(a_str, "%"PRIu64, a);

两种编译器都不报警告了。

探究

PRIu64 的定义在 inttypes.h 头文件里。

# if __WORDSIZE == 64
#  define __PRI64_PREFIX    "l"
# else
#  define __PRI64_PREFIX    "ll"
# endif# define PRIu64      __PRI64_PREFIX "u"

可以看到,
32 位编译器,会把 "%"PRIu64 扩展为 "%lld"
64 位编译器,会把 "%"PRIu64 扩展为 "%ld"
解决了这个问题。

C语言 PRIu64 宏相关推荐

  1. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  2. c 语言程序设计阚道宏,C语言用宏实现静态多态

    综述 多态性是面向对象程序设计的一个重要特征. 在C++语言中,多态指的是:具有不同功能的函数可以用同一个函数名,可以用一个函数名调用不同内容的函数. C++的多态分为两种: 1. 静态多态性(编译时 ...

  3. C语言 va_arg 宏 - C语言零基础入门教程

    目录 一.前言 二.va_arg 简介 三.va_arg 使用 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.前言 对 printf ...

  4. C语言 va_end 宏 - C语言零基础入门教程

    目录 一.前言 二.va_end 简介 三.va_end 使用 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.前言 对 printf ...

  5. C语言 va_start 宏 - C语言零基础入门教程

    目录 一.前言 二.va_start 简介 三.va_start 使用 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.前言 对 pr ...

  6. c语言用宏定义常量_使用宏定义常量以在C的数组声明中使用

    c语言用宏定义常量 As we know that, while declaring an array we need to pass maximum number of elements, for ...

  7. C/C++编程笔记:浅析 C 语言中宏定义的使用,知识点全解

    宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名.给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很 ...

  8. 【C语言】----宏定义,预处理宏

    什么是宏? 宏是学习任何语言所不可缺少的,优秀的宏定义可以使得代码变得很简洁且高效,有效地提高编程效率. 宏是一种预处理指令,它提供了一种机制,可以用来替换源代码中的字符串,解释器或编译器在遇到宏时会 ...

  9. c语言中宏定义的字符替换#define M(x,y,z) x*y+z

    C语言中宏定义的字符替换问题 例子: 在c语言中定义如下宏 #define M(x,y,z) x*y+z 给定如下程序 #include<stdio.h> #include<stdl ...

最新文章

  1. python统计字符串汉字个数_Python使用递归计算字符串中的字符数
  2. python day08
  3. C++ 之 贪吃蛇
  4. mysql router docker_Docker 安装 Mysql 详解
  5. 在Android App中集成Google登录
  6. c语言里 如何取得线程的lpparameter'参数,请问线程函数如何访问对话框类中的变量...
  7. ubuntu12.04中安装SVN记录
  8. JVM的方法区和永久带是什么关系?
  9. Filecoin网络存储容量已达3 EB
  10. HDOJ水题集合8:DBFS
  11. win7做wifi服务器
  12. Python 移动文件 文件转移 文件批量移动小工具
  13. CASS11.0.0.8 for AutoCAD2010-2023安装教程
  14. mac 清理微信缓存文件
  15. excel中NORM.DIST 的python实现
  16. php7 slowlog,php7: php-fpm seems busy提示
  17. 小米电视4A Android8,小米电视4A 删除内置应用及其去广告攻略
  18. 如何通过事务消息保障抢购业务的分布式一致性?
  19. Esp8266进阶之路14 esp8266的 FreeRtos系统学习的正确姿势,环境配置环境、烧录。(附带demo)
  20. 【转载】Windows上那些值得推荐的良心软件-整理 easybcd 引导工具 easyuefi 引导工具...

热门文章

  1. NXOPEN/UG二次开发C#---导入igs文件,获得导入的TaggedObject
  2. 怎样用万用表检测贴片三极管
  3. android重力传感器横竖反,Android重力感应实现方式
  4. 关于微信小程序内嵌的H5页面阿里云点播视频获取视频播放凭证
  5. 听觉外围分析matlab,扫描附近的低功耗 Bluetooth 外围设备 - MATLAB blelist - MathWorks 中国...
  6. 解决国内网页无法加载reCaptcha的方法
  7. 2022年儿童写作业的台灯怎么选择?推荐儿童护眼台灯品牌排行
  8. 矩阵求逆操作的复杂度分析(逆矩阵的复杂度分析)
  9. Latex排版—(2)基本结构
  10. Android开发插件推荐一:Lombok