2017-03-02 7 views
0

例えば、私の実装の1バイトとしてcharを定義した場合、それはちょうどGCCで正確な幅の整数型はどのように実装されていますか?

typedef int8_t char;

stdint.hでは、または実際にメモリ操作が行われていますか?

+1

正確な幅の整数型は、システムがサポートしていない場合は存在しないことがあります。代わりに* int_leastN_t *バージョンを使用してください。実装では、条件付きコンパイルを使用して、サポートされている各システムの各typedefを決める可能性が最も高いと言われています。 – DeiDei

+0

それをサポートしていないものは何ですか?それはosかコンパイラかチップか?私の個人的なプロジェクトは、C標準ライブラリ全体を再コーディングすることです。選択するのは私の判断です。 –

+0

標準では、それらがtypedefであることを要求しています(存在する場合はそれがあります) –

答えて

2

システムstdint.hは、アーキテクチャについての仮定を行うことができ、shortまたはintのサイズのようなものを知ることができます。 macOSの/usr/include/stdint.hは非常に読みやすいです。関連するビットがあります。

/* 7.18.1.1 Exact-width integer types */ 
#include <sys/_types/_int8_t.h> 
#include <sys/_types/_int16_t.h> 
#include <sys/_types/_int32_t.h> 
#include <sys/_types/_int64_t.h> 

#include <_types/_uint8_t.h> 
#include <_types/_uint16_t.h> 
#include <_types/_uint32_t.h> 
#include <_types/_uint64_t.h> 

/* 7.18.1.2 Minimum-width integer types */ 
typedef int8_t   int_least8_t; 
typedef int16_t   int_least16_t; 
typedef int32_t   int_least32_t; 
typedef int64_t   int_least64_t; 
typedef uint8_t   uint_least8_t; 
typedef uint16_t  uint_least16_t; 
typedef uint32_t  uint_least32_t; 
typedef uint64_t  uint_least64_t; 

個々のヘッダーファイルを掘り下げて、typedefを見ることができます。それぞれを見てみると、とてもシンプルです。

およびuint*_tは、その符号なしバージョンです。 GCCは、Mac上のシステムコンパイラではないので


、それはそれは建築についての仮定を行うことができない、打ち鳴らすですので、既存のstdint.hを使用しています。ここにgccのstdint.hがあります。システムstdint.hに独自のヘッダーを加えて、それ自身の非標準のものを追加します。

$ cat /opt/local/lib/gcc6/gcc/x86_64-apple-darwin16/6.3.0/include/stdint.h 
#ifndef _GCC_WRAP_STDINT_H 
#if __STDC_HOSTED__ 
# if defined __cplusplus && __cplusplus >= 201103L 
# undef __STDC_LIMIT_MACROS 
# define __STDC_LIMIT_MACROS 
# undef __STDC_CONSTANT_MACROS 
# define __STDC_CONSTANT_MACROS 
# endif 
# include_next <stdint.h> 
#else 
# include "stdint-gcc.h" 
#endif 
#define _GCC_WRAP_STDINT_H 
#endif 
関連する問題