[C] zlstdint(让VC、TC等编译器自动兼容C99的整数类型)V1.0。支持Turbo C++ 3等DOS下的编译器
作者: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下的编译器的更多相关文章
- [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 ...
- Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝
为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ...
- Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝
Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ...
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const strin ...
- Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就 ...
- C++、VC++、MFC网页自动注册、登陆、发帖、留言,QQ注册、QQ申请器源码、注册邮箱源码、自动发帖源码
C++.VC++.MFC网页自动注册.登陆.发帖.留言,QQ注册.QQ申请器源码.注册邮箱源码.自动发帖源码 参考资料: 自动登录yahoo邮箱http://blog.csdn.net/suisu ...
- C++进阶--不让编译器自动生成类函数
//############################################################################ /* * 不让编译器自动生成类函数 * * ...
- Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
规则一 将成员函数声明为private而且故意不实现他们 class HomeForSale { public: ... private: ... HomeForSale(const HomeForS ...
- Effective C++ 条款六 若不想使用编译器自动生成的函数,就该明确拒绝
class HomeForSale //防止别人拷贝方法一:将相应的成员函数声明为private并且不予实现 { public: private: HomeForSale(const HomeForS ...
随机推荐
- Java类路径
Java 类路径告诉 java 解释器和 javac 编译器去哪里找它们要执行或导入的类. 类(您可能注意到的那些 *.class 文件)可以存储在目录或 jar 文件中,或者存储在两者的组合中, 但 ...
- 拓扑排序 +Floyd(poj 1094)
题目:Sorting It All Out 题意:字母表前n个字母,有m组他们中的大小关系,判断n个字母是否构成唯一序列: 1.Sorted sequence determined after xxx ...
- vim/vi 复制,删除,粘贴,查找,替换
1.删除行 光标所在单行,dd 光标所在行以下的5行,5dd 全部删除:dG 2.复制 复制光标所在单行:yy 复制光标以下4行:4yy 3.粘贴 粘贴vi里复制的内容:p 粘贴外部复制过来的内容: ...
- Subsets 子集系列问题 leetcode
子集系列问题: Coding 问题中有时会出现这样的问题:给定一个集合,求出这个集合所有的子集(所谓子集,就是包含原集合中的一部分元素的集合). 或者求出满足一定要求的子集,比如子集中元素总和为定值, ...
- MySQL数据库小实验
实验1 1.创建数据表 CREATE TABLE guest( Accounts ) NOT NULL, Details ) NOT NULL, Date ) NOT NULL, ,), Class ...
- oracle每天清理归档日志
http://langzhiwang888.iteye.com/blog/1675033 参考这里的内容 在数据库服务器上新建一个bat文件(文件名随意) 编辑此文件为: rman target 's ...
- swoole 安装
swoole 安装: 1. 下载源代码,我下载的是1.8.6版本wget https://github.com/swoole/swoole-src/archive/1.8.6-stable.tar.g ...
- 数据库知识整理<四>
使用DML语句更改数据: 所谓DML语句是指数据库操作语句,其中包括的是对数据库数据的修改.删除.插入. 4.1添加新数据: 插入单行的记录:基本的SQL语句为-insert into <表明& ...
- Keepalived+tomcat的HA配置
需要节点 NODE1—————-IP:192.168.0.2 NODE2—————-IP:192.168.0.3 VIP—————-IP:192.168.0.10 以下操作在2台机器上都要运行 先编辑 ...
- iOS中数字的格式化 NSNumberFormatter
NSNumberFormatter 和NSDateFormatter 是NsFormatter的子类. NSNumberFormatter类有个属性numberStyle,它是一个枚举型,设置不同的值 ...