当前位置: 首页 > news >正文

C++中正确使用PRId64 (转载)

  转自:http://blog.csdn.net/win_lin/article/details/7912693

 

  

例子参考高性能流媒体服务器SRS:https://github.com/winlinvip/simple-rtmp-server

SRS中广泛使用PRId64实现32和64位系统通用。


c++使用PRID64,需要两步:

  1. 包含头文件:<inttypes.h>
  2. 定义宏:__STDC_FORMAT_MACROS,可以通过编译时加-D__STDC_FORMAT_MACROS,或者在包含文件之前定义这个宏。

int64_t用来表示64位整数,在32位系统中是long long int,在64位系统中是long int,所以打印int64_t的格式化方法是:

    printf("%ld", value); // 64bit OS  
    printf("%lld", value); // 32bit OS  

当然有跨平台的方法:

    #include <inttypes.h>  
    printf("%" PRId64 "\n", value);  
    // 相当于64位的:  
    printf("%" "ld" "\n", value);  
    // 或32位的:  
    printf("%" "lld" "\n", value);  

其中,printf("abc" "def" “ghi")这样写多个字符串是没有问题的。

但是,死活都编译不过,错误是:error: expected ‘)’ before ‘PRId64’

找了一下这个宏的定义,/usr/include/inttypes.h:

    /* The ISO C99 standard specifies that these macros must only be 
       defined if explicitly requested.  */  
    #if !defined __cplusplus || defined __STDC_FORMAT_MACROS  
      
    # if __WORDSIZE == 64  
    #  define __PRI64_PREFIX    "l"  
    #  define __PRIPTR_PREFIX   "l"  
    # else  
    #  define __PRI64_PREFIX    "ll"  
    #  define __PRIPTR_PREFIX  
    # endif  
      
    /* Macros for printing format specifiers.  */  
      
    /* Decimal notation.  */  
    # define PRId8      "d"  
    # define PRId16     "d"  
    # define PRId32     "d"  
    # define PRId64     __PRI64_PREFIX "d"  

原来这个是定义给c用的,C++要用它,就要定义一个__STDC_FORMAT_MACROS宏显示打开它。

    /* test_int64.cpp 
    g++ -D__STDC_FORMAT_MACROS -o test_int64 -g -O0 test_int64.cpp 
    */  
    #include <stdio.h>  
    #include <inttypes.h>  
      
    int main(int argc, char** argv){  
        int64_t value = 0xFFFFFFFFFFFF;  
        printf("int64_t=%"PRId64", sizeof(int64_t)=%d\n", value, sizeof(int64_t));  
    }  

编译并执行:

g++ -D__STDC_FORMAT_MACROS -o test_int64 -g -O0 test_int64.cpp

./test_int64

int64_t=281474976710655, sizeof(int64_t)=8

对于C++新标准-std=c++0x,还可以使用更好的方式:

    /* test_int64_1.cpp  
    g++ -o test_int64_1 -g -O0 test_int64_1.cpp 
    */  
    #include <stdio.h>  
    #include <cinttypes>  
    using namespace std;  
      
    int main(int argc, char** argv){  
        int64_t value = 0xFFFFFFFFFFFF;  
        printf("int64_t=%"PRId64", sizeof(int64_t)=%d\n", value, sizeof(int64_t));  
    }  

不用定义那个宏了,编译和执行:

g++ -o test_int64_1 -g -O0 test_int64_1.cpp -std=c++0x

./test_int64_1

int64_t=281474976710655, sizeof(int64_t)=8

当然得指定一个新的参数:-std=c++0x,否则会报错“#error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.”

若能使用较新的g++编译,可以使用后者,否则可以用前者直接定义宏。

转载于:https://www.cnblogs.com/lance-ehf/p/4146310.html

相关文章:

  • 一些变量(39~62)
  • [转]Java学习日记之 volatile
  • beta 分布的简单理解
  • 二. Weinre 调试 IOS Hybrid APP
  • careercup-C和C++ 13.10
  • 冬吴相对论锦言佳句--0005.薄伽梵歌与“印度式管理”
  • 实用脚本 4 -- Makefile(不同文件下的多个可执行文件or静态库编译到同一目录下)...
  • C# dataGridView不显示默认行的解决办法
  • 微信宣布降低企业号认证门槛 1000人以下的企业无需规模证明
  • thinkphp3.2分页
  • 临时数据更改规范
  • [xPlugin] smartupload jsp图片上传
  • 【推荐】我们这一代人的困惑
  • WCF架构日记-1
  • 【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
  • 【翻译】babel对TC39装饰器草案的实现
  • ES6语法详解(一)
  • HomeBrew常规使用教程
  • Laravel Telescope:优雅的应用调试工具
  • linux安装openssl、swoole等扩展的具体步骤
  • Linux中的硬链接与软链接
  • SpiderData 2019年2月25日 DApp数据排行榜
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 记录:CentOS7.2配置LNMP环境记录
  • 首页查询功能的一次实现过程
  • 微信小程序:实现悬浮返回和分享按钮
  • 新书推荐|Windows黑客编程技术详解
  • 走向全栈之MongoDB的使用
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​决定德拉瓦州地区版图的关键历史事件
  • #include到底该写在哪
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (0)Nginx 功能特性
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (Oracle)SQL优化技巧(一):分页查询
  • (ZT)出版业改革:该死的死,该生的生
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (第一天)包装对象、作用域、创建对象
  • (南京观海微电子)——COF介绍
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (四) 虚拟摄像头vivi体验
  • (五)IO流之ByteArrayInput/OutputStream
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 怎么循环得到数组里的值_关于js数组
  • .net/c# memcached 获取所有缓存键(keys)
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .Net中间语言BeforeFieldInit
  • /dev下添加设备节点的方法步骤(通过device_create)