2017-02-21 7 views
2

私は次の問題に遭遇しました。具体的な説明は見つかりませんでした。なぜCは型定義を提供するのですか? を使ってBOOL型を定義するのと同じくらいBOOLマクロを定義していませんか?例えば、#defineディレクティブはブール型として使用できるマクロを作成するために使用することができCは型定義を提供するのがなぜ迷惑ですか?

#define Bool int 

型定義と呼ばれる機能を使用して、ブールタイプを設定する別の方法があります。

typedef int Bool; 

なぜ最後の方法が優先されますか?利点は何ですか?

+1

Cには 'BOOL'マクロがなく、組み込みの' bool'型もありません。しかし、自作の 'typedef'やマクロの代わりに使うべき' 'Boolena''型の' _Bool'があります。あなたの質問:これは**好まれず強く推奨されていません。 – Olaf

+1

Cの '_Bool'は、OPの' typedef int Bool; 'の結果とは異なる型です。ここの 'Bool'は、OPの' typedef'と '#define'の関係を示す良い例ではありません。 – chux

+0

@chux:それらが異なるところの例: '_Bool b = 5; – Olaf

答えて

8

上記の理由以外にも、もう1つMACROを定義して再定義することはできますが、typedefではできません。したがって、1つの観点からは、typedefは、確定的です。

#define MAX 5 

//some use of MAX 

#undef MAX 
#define MAX 10 

// some more use of MAX 

例えば

は完全に有効ですが、「タイプ」は、すでに先に定義されているとおり

typedef int into; 

///something.... 

typedef char into; 

ような何かをしようとする試みは、無効です。

したがって、「タイプ」へのエイリアスを作成するtypedefは、その点でより一貫しているとみなされます。

+3

*「だから、ある視点から、typedefはより確定的です」* - これは私が今日聞いた最高のものです。 – StoryTeller

+3

@StoryTeller Twiceは良い選択肢ではありませんが、3度行ってください。 :P –

10

型定義とマクロ定義には2つの重要な違いがあります。

タイプ定義はマクロ定義よりも強力です。特に、の配列とポインタ型をマクロとして定義することはできません。たちは "整数へのポインタ" を定義するためにマクロを使用しようというタイプとします

#define PTR_TO_INT int * 

を宣言

PTR_TO_INT p, q, r 

は、前処理後

int * p, q, r 

になります。残念ながら、のみpはポインタです。 qおよびrは、通常の整数変数です。型定義にこの問題はありません。

第2に、typedefの名前は変数と同じスコープルールの対象です。関数本体の中で定義された名前typedefは、関数の外では認識されません。一方、マクロ名は、どこにあってもプリプロセッサに置き換えられます。

+1

オブジェクトポインタは決して 'typedef'してはいけません。と思っていた場合にのみ配列。 – Olaf

+1

弱点は、 '#define PTR_TO_INT int *'の問題が議論されているにもかかわらず、 'typedef'を使用した解決策が示されていないことです.IOWは一方的な議論です。 'typdef int * ptr_to_int;'は勝利の解決策ではありません。 – chux

+1

@chux "' typdef int * ptr_to_int; 'は勝利の解決策ではありません。確かに '#define PTR_TO_INT int *'で勝利します。このような状況では、私は 'typedef'に何が間違っているのか見当たりません。 'typedef'は関数を引数として複雑な定義や宣言を行う構造体では、引数として多くのことを理解しやすくなります。 –

関連する問題