https://blog.csdn.net/paschen/article/details/74554955
C/C++标准库由于需要具有良好的通用性与全面性,使用了较为复杂的实现方法,实现的代码庞大
对于简单的Windows程序,使用C/C++标准库生成的EXE文件体积较大,整个程序80%以上代码可能均来源于标准库
一种可行的解决办法是使用C/C++动态库(MTd、MT),但这要求系统安装有相应版本的CRT
简单的程序往往功能要求不多、限制通常较少、无需考虑过多情况,使用C/C++标准库如同使用高射炮打蚊子
扫描二维码关注公众号,回复:
1476039 查看本文章
此时,一种更好的方法是架空C/C++标准库,直接使用Windows API (参看: C/C++程序减小可执行文件的大小)
常用的标准库函数实现往往比较简单,但浮点数与字符串的转换则较为复杂,自己实现的代码往往无法周到全面地考虑各种情况
笔者通过对浮点数存储格式深入研究,并参考VS2015标准库相关代码,实现了不使用C/C++标准库浮点数与字符串相互转换的代码
代码考虑了字符串各种特殊情况:Inf、Nan、上溢、下溢等等,支持十六进制的浮点数字符串,运行效果与使用标准库完全相同
啰嗦了那么多,言归正传,直接给实现代码
头文件(浮点数转字符串与字符串转浮点数的函数接口):
- /////////////////////////////////////////////////////////////////////////////
- // DoubleConversion.h: header file
- //
- // DoubleConversion - Do not use CRT.
- //
- // Written by Paschen <[email protected]>
- // Copyright (c) 2017. All Rights Reserved.
- //
- // This code may be used in compiled form in any way you desire. This
- // file may be redistributed unmodified by any means PROVIDING it is
- // not sold for profit without the authors written consent, and
- // providing that this notice and the authors name and all copyright
- // notices remains intact.
- //
- // An email letting me know how you are using it would be nice as well.
- //
- // This file is provided "as is" with no expressed or implied warranty.
- // The author accepts no liability for any damage/loss of business that
- // this product may cause.
- //
- /////////////////////////////////////////////////////////////////////////////
- #ifndef DOUBLECONVERSION_H_H_H
- #define DOUBLECONVERSION_H_H_H
- #include <Windows.h>
- //说明: 将double类型浮点数转换为字符串
- //参数:
- // lpszBuffer: 转换结果缓冲区
- // value: 要转换的浮点数
- // FractionalDigitCount: 保留的小数位数
- //返回值: 转换结果(字符串)
- LPTSTR Double2String(LPTSTR lpszBuffer, double value, UINT32 FractionalDigitCount);
- //转换状态枚举
- typedef enum
- {
- SLD_OK,
- SLD_NODIGITS,
- SLD_UNDERFLOW,
- SLD_OVERFLOW
- } SLD_STATUS;
- //说明: 将字符串转换为double类型浮点数
- //参数:
- // lpszString: 要转换的字符串
- // result: 转换结果(double类型浮点数)
- //返回值: 转换状态枚举
- SLD_STATUS String2Double(LPCTSTR lpszString, double& result);
- #endif