当前位置:   article > 正文

如何使用 printf 系列可移植地打印 size_t 变量? #让代码影响世界_size_t printf

size_t printf

本篇将介绍在C/C++编码中如何用printf打印size_t/ssize_t这类变量类型,最常用到的就是c语言中的size操作,还有C++中的vector::size(),以及其它 STL 容器的 size()也是如此。

 C语言例子:

  1. int main(void)
  2. {
  3. int fd1 = open("test.txt", O_RDONLY); // 只读模式打开文件
  4. if (fd1 == -1) {
  5. perror("open test.txt");
  6. exit(1);
  7. }
  8. char buf[1024] = {0};
  9. ssize_t r_count = read(fd1, buf, sizeof(buf));
  10. if (r_count == -1) {
  11. perror("read fd1");
  12. exit(1);
  13. }
  14. printf("read bytes = %d\n", r_count); // 读取成功返回读取的字节数
  15. close(fd1);
  16. return 0;
  17. }

编译后会出现一个编译警告

   warning: format '%d' expects type 'signed int', but argument 2 has type 'long signed int'

原因在于:系统调用的返回值为ssize_t

    #include <unistd.h> ssize_t read(int fs, void *buf, size_t N);

32位系统上述代码没有问题,但64位系统,或者兼容32/64位系统,则须要采用z modifier的方法。

正确方法是参考如下使用zu\zx\zd格式化字符串

  1. size_t x = ...;
  2. ssize_t y = ...;
  3. printf("%zu\n", x);  // prints as unsigned decimal
  4. printf("%zx\n", x);  // prints as hex
  5. printf("%zd\n", y);  // prints as signed decimal

C++例子:用 printf 打印 vector 的 size,如下例代码,

  1. // g++ cpp-printf-size_t.cpp -o a.out -std=c++11
  2. #include <iostream>
  3. #include <vector>
  4. using namespace std;
  5. int main() {
  6. vector<int> v = {1, 2, 3, 4, 5};
  7. printf("size=%d", v.size());
  8. }

来自 <C/C++ printf 列印 size_t 的方法 | ShengYu Talk>

编译后会出现一个编译警告:

cpp-printf-size_t.cpp:8:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘std::vector<int>::size_type {aka long unsigned int}’ [-Wformat=]

printf("size=%d", v.size());

来自 <https://www.ibm.com/docs/en/zos/2.3.0?topic=functions-read-read-from-file-socket>

改为zu则可合理解决该问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/208847
推荐阅读
相关标签
  

闽ICP备14008679号