2017-07-04 11 views
0

私はさまざまなヘッダーファイルの整数型の定義が互いにどのように関係しているのか把握しようとしています。GNU Cプリプロセッサの定義済みマクロはどのように使用されていますか?

CygWinをインストールしました。私はCygwin\x86\usr\include\machine\_default_types.hを開いた。その中に、私は、コードスニペットの下に気づいた:

#ifdef __INT8_TYPE__ 
typedef __INT8_TYPE__ __int8_t; 

hereによれば、__INT8_TYPE__は、予め定義されたプリプロセッサマクロの一つです。そして:

これらのマクロは直接使用しないでください。代わりに、 の適切なヘッダーを含め、typedefを使用します。これらのマクロの中には、GCCがstdint.hヘッダをこれらのシステムに提供していない場合、特定のシステムで定義されていないものがあります( )。

だから、__INT8_TYPE__は他のどこかで定義する必要があります。しかし、私はCygWinのインストール全体を検索しましたが、定義はありません。私が見つけたのは、上記のようないくつかの条件文です。

私は直接使用しないでください。それを定義するファイルは他にありません。このマクロはどのように動作するのでしょうか?それとも私は何かを誤解しましたか?

答えて

4

これはあらかじめ定義されたマクロです。それらを参照するには、次のことができます。

gcc -dM -E - < /dev/null 

例えば:

$ gcc -dM -E - < /dev/null | grep __INT 
#define __INTMAX_C(c) C## L 
#define __INT8_C(c) c 
#define __INT64_C(c) C## L 
#define __INT32_MAX__ 0x7fffffff 
#define __INT_FAST32_MAX__ 0x7fffffffffffffffL 
#define __INT_FAST16_TYPE__ long int 
#define __INT_LEAST32_MAX__ 0x7fffffff 
#define __INT_FAST64_TYPE__ long int 
#define __INT32_C(c) c 
#define __INT_FAST32_TYPE__ long int 
#define __INT16_MAX__ 0x7fff 
#define __INT8_TYPE__ signed char 
#define __INT_LEAST16_TYPE__ short int 
#define __INT_FAST16_MAX__ 0x7fffffffffffffffL 
#define __INT_LEAST16_MAX__ 0x7fff 
#define __INT64_MAX__ 0x7fffffffffffffffL 
#define __INT_LEAST64_TYPE__ long int 
#define __INT16_TYPE__ short int 
#define __INT_LEAST8_TYPE__ signed char 
#define __INT_FAST8_MAX__ 0x7f 
#define __INTPTR_MAX__ 0x7fffffffffffffffL 
#define __INTPTR_TYPE__ long int 
#define __INT_FAST64_MAX__ 0x7fffffffffffffffL 
#define __INT_MAX__ 0x7fffffff 
#define __INT64_TYPE__ long int 
#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL 
#define __INT_LEAST8_MAX__ 0x7f 
#define __INT_LEAST32_TYPE__ int 
#define __INT_FAST8_TYPE__ signed char 
#define __INTMAX_MAX__ 0x7fffffffffffffffL 
#define __INT8_MAX__ 0x7f 
#define __INT32_TYPE__ int 
#define __INTMAX_TYPE__ long int 
#define __INT16_C(c) c 
+1

ので、それは、特定のプラットフォーム用のコンパイラに組み込まれており、私はそれを変更することはできませんか...? – smwikipedia

+0

@smwikipediaこれらはプラットフォームとコンパイラ固有のものです。おそらく彼らは変更不可能です。 – ldav1s

+1

私が本当に "修正不可能"について言わなければならないのは、これらのマクロが[予約された識別子](http://en.cppreference.com/w/c/language/identifier#Reserved_identifiers)であり、プログラム(UB)。あなたは別のライブラリ(例えば 'libc')にリンクしたときに、再定義された' int8_t'は 'libc's' int8_t'のサイズやsignednessにマッチしません(ただし、些細な再定義 - しかし、それのポイントは何ですか?)ので、すべての種類の楽しい破損が続くことができます。 – ldav1s

関連する問題