作者:zyl910

  以前我曾为了让VC++等编译器支持C99的整数类型,便编写了c99int库来智能处理(http://www.cnblogs.com/zyl910/p/c99int_v102.html)。如今为了兼容Turbo C++ 3等DOS下的编译器,做了重大改变,不再适合沿用旧名,于是采用了zlstdint这个新名。

一、用法简介

  用法很简单——把z_stdint.h、z_inttyp.h这2个文件放到你的项目中,便可以正常的使用C99整数类型及相关的宏了。

  范例代码——

#define __STDC_LIMIT_MACROS
#define __STDC_CONSTANT_MACROS
#define __STDC_FORMAT_MACROS #include <stdio.h> #include "z_stdint.h"
#include "z_inttyp.h" /// main.
int main(int argc, char* argv[]) {
uint8_t i8 = (uint8_t)INT8_C(-);
uint16_t i16 = (uint16_t)INT16_C(-);
uint32_t i32 = (uint32_t)INT32_C(-);
#ifdef INT64_MAX
uint64_t i64 = (uint64_t)INT64_C(-);
#endif #ifdef INT64_MAX
printf("stdint:\t%" PRIu8 ", %" PRIu16 ", %" PRIu32 ", %" PRIu64 "\n", i8, i16, i32, i64);
#else
printf("stdint:\t%" PRIu8 ", %" PRIu16 ", %" PRIu32 "\n", i8, i16, i32);
#endif
return ;
}

  由于旧编译器不支持64位整数类型,故根据INT64_MAX宏来判断是否支持。

二、改动详述

  为了支持Turbo C++ 3等DOS下的编译器,于是精心设计了头文件名,使其符合8.3文件名命名规则。文件名对应关系为——
z_stdint.h:对应C99标准中的“stdint.h”。
z_inttyp.h:对应C99标准中的“inttypes.h”。

  用“z_”的前缀表示它用于兼容C标准中的头文件,随后的6个字母是对应头文件的缩写。

  由于Turbo C++ 3等旧编译器不支持64位整数类型,于是zlstdint也做了相应调整——若发现编译器不支持64位整数类型,便不会定义标准64位整数类型(int64_t、uint64_t、int_least64_t……)及相应宏(INT64_MAX、UINT64_MAX……),且intmax_t等最大整数类型被限制为32位。为了检测这种情况,zlstdint提供了Z_STDINT_INTMAX_BIT(intmax_t 类型的位数)宏。

  考虑到自动识别编译器的代码有可能会误判,于是提供了这些配置型宏——
Z_STDINT_H_USESYS: 是否使用的是编译器提供的 stdint.h .
Z_INTTYP_H_USESYS: 是否使用的是编译器提供的 inttypes.h .

三、测试结果

  测试过以下编译器——

* Virtual C++: 6, 7.1(2003), 8(2005), 9(2008), 10(2010), 11(2012), 12(2013).
* Turbo C++: Turbo C++ 3, Borland C++ 3.1, C++ Builder 6, C++ Builder XE3 .
* GCC(Linux): 4.7.0~4.8.2(Fedora 17~20), 4.6.3~4.8.2(Ubuntu 12.04~14.04).
* GCC(MinGW): 4.6.2(MinGW(20120426)), 4.7.1~4.9.2(TDM-GCC(MinGW-w64)).
* LLVM GCC: 4.2(Mac OS X Lion 10.7.4), 4.2.1(Mac OS X Mountain Lion 10.8.3).

  例如在DOS下的Turbo C++ 3中编译通过——

参考文献
~~~~~~~~

《ISO/IEC 9899:1999 (C99)》。ISO/IEC,1999。www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
《C99标准》。yourtommy。http://blog.csdn.net/yourtommy/article/details/7495033
《[C/C++] 显示各种C/C++编译器的预定义宏(C11标准、C++11标准、VC、BCB、Intel、GCC)》. http://www.cnblogs.com/zyl910/archive/2012/08/02/printmacro.html
《[C] 让VC、BCB支持C99的整数类型(stdint.h、inttypes.h)(兼容GCC)》. http://www.cnblogs.com/zyl910/archive/2012/08/08/c99int.html
《[C] 让VC支持C99的整数类型V1.01。避免包含目录问题,更名auto_stdint.h、auto_inttypes.h(在VC6至VC2012、GCC、BCB等编译器下测试通过)》. http://www.cnblogs.com/zyl910/archive/2013/01/10/c99int_v101.html
《[C] c99int(让VC等编译器自动兼容C99的整数类型)V1.02。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释》. http://www.cnblogs.com/zyl910/p/c99int_v102.html

源码下载——
https://github.com/zyl910/zlstdint

[C] zlstdint(让VC、TC等编译器自动兼容C99的整数类型)V1.0。支持Turbo C++ 3等DOS下的编译器的更多相关文章

  1. [C] c99int(让VC等编译器自动兼容C99的整数类型)V1.02。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释

    新版本—— http://www.cnblogs.com/zyl910/p/zlstdint_v100.html[C] zlstdint(让VC.TC等编译器自动兼容C99的整数类型)V1.0.支持T ...

  2. Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝

    为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ...

  3. Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝

    Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ...

  4. Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝

    一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const strin ...

  5. Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就 ...

  6. C++、VC++、MFC网页自动注册、登陆、发帖、留言,QQ注册、QQ申请器源码、注册邮箱源码、自动发帖源码

    C++.VC++.MFC网页自动注册.登陆.发帖.留言,QQ注册.QQ申请器源码.注册邮箱源码.自动发帖源码   参考资料: 自动登录yahoo邮箱http://blog.csdn.net/suisu ...

  7. C++进阶--不让编译器自动生成类函数

    //############################################################################ /* * 不让编译器自动生成类函数 * * ...

  8. Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝

    规则一 将成员函数声明为private而且故意不实现他们 class HomeForSale { public: ... private: ... HomeForSale(const HomeForS ...

  9. Effective C++ 条款六 若不想使用编译器自动生成的函数,就该明确拒绝

    class HomeForSale //防止别人拷贝方法一:将相应的成员函数声明为private并且不予实现 { public: private: HomeForSale(const HomeForS ...

随机推荐

  1. 本地调试webapi

    1.新建iis站点,路径关联到代码站点下D:\work\易解科技\程序源码\YQJ\trunk\YQJOpenAPI\YQJOpenAPI 2.vs以管理员身份启动 3.附加到进程 w3wp.exe ...

  2. <雨季>

    忘不了节后漫长的雨季,灰暗阴冷的天气,潮湿的心情,总让我怀念家乡刺眼的阳光,即使在寒冷的冬季,唯有那窗外的紫荆花独自开放.飘落满地,给灰色的世界增添点色彩,合着同学们上早课的笑声,暂时排遣那一份思乡情 ...

  3. 配置org.springframework.scheduling.quartz.CronTriggerBean(转)

    注意:定时器方法里如果执行动作的时间超出了定时器的周期,将会产生两个方法同时执行的情况. 一个Quartz的CronTrigger表达式分为七项子表达式,其中每一项以空格隔开,从左到右分别是:秒,分, ...

  4. css3 border-image 学习随笔

    先上w3school数据: 对于分开设置如上表所示,没有疑惑.但是当缩写时: border-image:url(/i/border.png) 30 30 round; 一参:图片地址: 二参.三参:只 ...

  5. Ubuntu远程开机 (Wake on Lan)

    启动者(A) 被远程开启者(B) 一.被远程开启的电脑(电脑B):1. 重新开机,并进到BIOS设定2. 把Wake On Land / Wake On PCI(E)设为Enable3. 储存并进入U ...

  6. Dapper试用

    以下代码摘自imfunny的<给力分享新的ORM => Dapper> http://www.cnblogs.com/imfunny/archive/2011/09/16/21788 ...

  7. SOA问题处理

    R12.1: How To Generate SOA Log For Debugging SOA Provider Issues (文档 ID 828753.1) 转到底部 In this Docum ...

  8. 让ASP.NET Web API支持text/plain内容协商

    ASP.NET Web API的内容协商(Content Negotiation)机制的理想情况是这样的:客户端在请求头的Accept字段中指定什么样的MIME类型,Web API服务端就返回对应的M ...

  9. 透过 HoloLens,微软抢先看到了个人计算机的未来

    "换一种方式看世界,你将能改变世界." 微软昨天在 Windows 10 大会上亮出了重量级的明星产品 HoloLens,这是一款头戴式显示设备.Business Insider ...

  10. [stm32] Systick

    (一) 背景介绍在传统的嵌入式系统软件按中通常实现 Delay(N) 函数的方法为:for(i=0;i<=x;i++); x--:            对应于N毫秒的循环值对于STM32系列微 ...