这里说的类型长度指的是相同类型在不同环境下长度不一致的情况,下面总结表格:

由于这里出现了 32 位和 64 位环境下长度不一致的情况,C 语言特意提供了 stdint.h 头文件 (C++ 中在 cstddef 中引用),定义了定长类型,例如 int64_t 在 32 位环境下其实是 long long,而在 64 位环境下其实是 long。

但这里的问题点在于:

  • 并没有定长格式符

例如 uint64_t 在 32 位环境下对应的格式符是 % llu,但是在 64 位环境下对应的格式符是 % lu。有一种折中的解决办法是自定义一个宏:

#if(sizeof(void*) == 8)
#define u64 "%lu"
#else
#define u64 "%llu"
#endifvoid demo() {uint64_t a;printf("a="u64, a);
}

但这样会让字符串字面量从中间断开,非常不直观。

  • 类型不一致

例如在 64 位环境下,long 和 long long 都是 64 位长,但编译器会识别为不同类型,在一些类型推导的场景会出现和预期不一致的情况,例如:

template <typename T>
void func(T t) {}template <>
void func<int64_t>(int64_t t) {}void demo() {long long a;func(a); // 会匹配通用模板,而匹配不到特例
}

上述例子表明,func<int64_t> 和 func<long long > 是不同实例,尽管在 64 位环境下 long 和 long long 真的看不出什么区别,但是编译器就是会识别成不同类型。

格式化字符串

格式化字符串算是非常经典的 C 的产物,不仅是 C++,非常多的语言都是支持这种格式符的,例如 java、Go、python 等等。

但 C++ 中的格式化字符串可以说完全就是 C 的那一套,根本没有任何扩展。换句话说,除了基本数据类型和 0 结尾的字符串以外,其他任何类型都没有用于匹配的格式符。

例如,对于结构体类型、数组、元组类型等等,都没法匹配到格式符:

struct Point {double x, y;
};void Demo() {// 打印PointPoint p {1, 2.5};printf("(%lf,%lf)", p.x, p.y); // 无法直接打印p// 打印数组int arr[] = {1, 2, 3};for (int i = 0; i < 3; i++) {printf("%d, ", arr[i]); // 无法直接打印整个数组} // 打印元组std::tuple tu(1, 2.5, "abc");printf("(%d,%lf,%s)", std::get<0>(tu), std::get<1>(tu), std::get<2>(tu)); // 无法直接打印整个元组
}

对于这些组合类型,我们就不得不手动去访问内部成员,或者用循环访问,非常不方便。

针对于字符串,还会有一个严重的潜在问题,比如:

std::string str = "abc";
str.push_back('\0');
str.append("abc");char buf[32];
sprintf(buf, "str=%s", str.c_str());

由于 str 中出现了 '\0',如果用 % s 格式符来匹配的话,会在 0 的位置截断,也就是说 buf 其实只获取到了 str 中的第一个 abc,第二个 abc 就被丢失了。

int64_t 在 32 位环境下其实是 long long相关推荐

  1. 实况10硬盘版在win7,64位环境下如何使用

    在XP,或者win7,32位环境下,实况10免安装版只需要双击一个注册信息,将数据信息添加到注册表中即可,但是在64位中,这样做后,打开软件会弹出提示:the game is not properly ...

  2. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  3. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  4. python3.7 win10 64位系统下用pyinstaller打包的程序在32位系统下无法运行

    问题背景: 在64位的win10系统下,用python 3.7.4 写了个定时报警的小玩意儿,主要用到了pyaudio模块,写完之后,使用pyinstaller打包成.exe文件,在其他64位的电脑下 ...

  5. java安装32位环境遇到的问题

    java安装32位环境遇到的问题,.pack文件解压为jar文件 前言 window下强制杀死某个java进程 彻底删除安装的JAVA环境 java开发包内部错误61003 .pack文件解压为jar ...

  6. windows7 64位环境下安装apache+mysql5.5+php7经验

    安装环境时遇到的一写问题现总结如下: 整体都是  windows64位环境下  vc14 首先电脑上安装的是vs2015环境 安装顺序: 1.首先安装apache2.4安装包,解压即可 2.php7压 ...

  7. linux32位运行64位程序,32位windows下可以运行的程序在64位linux下报错

    已结贴√ 问题点数:20 回复次数:3 32位windows下可以运行的程序在64位linux下报错 filt.c在32位windows code:blocks 10.05下运行无任何异样. 传到64 ...

  8. python2.7安装教程win7_win7 64位环境下,为python2.7 安装pip

    第一步: 安装python并配置好环境变量 第二步: 下载setuptools源码setuptools-38.5.1.zip,地址:https://pypi.python.org/pypi/setup ...

  9. win10,64位环境下curl7下载安装和配置详细图文教程(亲测有效)

    win10,64位环境下curl7下载安装和配置教程 一.前期准备: (1)windows10,64位: (2)python3.8 二.下载: 三.安装: 四.环境变量配置: (1)新建 ==CURL ...

最新文章

  1. html 逗号用什么替换,字符串用javascript数组中的逗号替换“↵”
  2. RDKit:化合物相似性搜索
  3. 用时间换才华:李开复给创业者的7条时间管理建议 【转载】
  4. Xcode 添加前缀
  5. redis集群的几种模式
  6. python语言逆序符号_python的逆序
  7. 原生jsonp发送跨域请求
  8. Microsoft Azure 大计算 – 宣布收购 GreenButton
  9. css 背景色半透明 子元素不透明
  10. 【图像处理】基于matlab GUI图像直方图+滤波处理【含Matlab源码 839期】
  11. [渝粤教育] 江苏农牧科技职业学院 兽医文化 参考 资料
  12. 聊天记录怎么录视频 微信聊天记录屏幕录制
  13. Loss和神经网络训练
  14. Delphi Thread 多线程编程(6)
  15. win 10计算机文件,Win10电脑怎么转移c盘文件?
  16. keystore导出p12,cer,crt,.key.pem证书文件格式
  17. BZOJ 3573 [HNOI2014]米特运输
  18. 第三届蓝桥杯JavaC组国(决)赛真题
  19. 自已写的“动易PowerEasy2006暴库工具”
  20. 设计模式之禅(第2版)

热门文章

  1. 日常快捷键、代码快捷键
  2. C++ vector函数接口及其底层原理
  3. 马来西亚理科大学计算机专业雅思,马来西亚理科大学本科雅思成绩要求
  4. 高斯模糊(高斯滤波)的原理与算法
  5. 电子行业数字工厂管理系统有哪些优点和不足
  6. 上台阶问题:一个人上台阶,一次可以走1、2、3步,问n个台阶有多少种走法?
  7. launcher3 修改默认桌面布局
  8. DNS劫持 DNS污染 介绍 与 公共DNS 推荐
  9. 华为机试—手机号码验证
  10. MAC 如何配置 PCL 库并在 VS Code 中使用