程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [C] zlstdint(讓VC、TC等編譯器自動兼容C99的整數類型)V1.0。支持Turbo C++ 3等DOS下的編譯器,zlstdintc99

[C] zlstdint(讓VC、TC等編譯器自動兼容C99的整數類型)V1.0。支持Turbo C++ 3等DOS下的編譯器,zlstdintc99

編輯:C++入門知識

[C] zlstdint(讓VC、TC等編譯器自動兼容C99的整數類型)V1.0。支持Turbo C++ 3等DOS下的編譯器,zlstdintc99


作者: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(-1);
    uint16_t i16 = (uint16_t)INT16_C(-1);
    uint32_t i32 = (uint32_t)INT32_C(-1);
#ifdef INT64_MAX
    uint64_t i64 = (uint64_t)INT64_C(-1);
#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 0;
}

 

  由於舊編譯器不支持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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved