2016-07-21 7 views
3

私はここキロテキストエディタのためのコードを勉強していました:誰かがstdlib.hを2回インクルードする理由はありますか?

https://github.com/antirez/kilo/blob/master/kilo.c

をそして、私はstdlib.h倍(UPDATE:コメントは私です):定義されて含まれていることに気づいた

#include <termios.h> 
#include <stdlib.h> // first time 
#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <stdlib.h> // second time 
#include <ctype.h> 

は単にこのですエラー?それとも何かありますか?コードの作成者が多くの間違いを犯した人のように見えないので、私は尋ねます。私は無知の変化を示唆したくはありません。

+3

@alk yeahコードの間違った行を特定しました。ちょうど上のものです。修正しました。 –

+1

"* stdlib.hを2回インクルードしますか?*"私はこのスローピー性を考えます。そして、いいえ、正しい実装のために、2番目のインクルードは害を及ぼさない、実際にはNOPです。 – alk

+3

うまくいけば、ちょっと見落としがあります。 stdlib.hが "ifdefsのダンス"をやっていないと、2番目のインクルージョンが効果的にNoOPになるのは驚きです。 – John3136

答えて

5

stdlib.hはインクルードガードを持っているので、2度インクルードする必要はありません。おそらく、間違いはstdlib.hに依存する2つのファイルをマージすることによって発生したと考えられます。

+0

"*はインクルードガードを持っています*"うまくいけばそれがあります。私たちはどの実装が周りにあるのか分かりません。 – alk

+0

@alk標準ヘッダーにガードが含まれていない実装について知っていますか? – Kusalananda

+0

いいえ、私には分かりませんがたくさんあります;-) – alk

2

特定のヘッダーファイルを2回含める理由はありません。ファイルに適切なインクルードガードがある場合、2番目のインクルードは効果を持ちません。ガードが含まれていない場合は、typedefなどの複数の定義に対して多数のエラーが発生する可能性があります。

システムヘッダーの場合、ほとんどの場合、常にガードが含まれています。 STDLIB.Hの内容は次のようなものになります。

#ifndef _STDLIB_H 
#define _STDLIB_H 1 
... 
// type definitions, #defines, declarations, etc. 
... 
#endif /* stdlib.h */ 

STDLIB.Hが含まれている最初の時間を、#ifndefがtrueに評価され、_STDLIB_Hが定義され、残りの内容がコンパイルされているファイルに挿入されています。 2回目のstdlib.hが含まれている場合、_STDLIB_Hが定義されており、#ifndef#endifの間のファイルの内容は再び挿入されないため、#ifndefはfalseと評価されます。

ほとんどのUNIX/Linuxシステムでこれが行われます。対照的に、MicrosoftはOS固有のインクルードファイルを適切に管理していないことで知られています。それらを間違った順序で組み込むと、多くのエラーが発生します。

1

これは、包含の1つがが未定義の場合にのみ発生します。以前のインクルードの一部のシンボル(インクルードガードを含む)。 、

#include "1.h" 
#include "2.h" 

int B = A; 

がエラーを生成します。
1.H:

#define A 1 

2.H:今

#undef A 

、以下の手順2つのファイルを考えてみましょうAは未定義です。

次のシーケンスだけで罰金になります。今

#include "1.h" 
#include "2.h" 
#include "1.h" 

int B = A; 

1.hには警備員が含まれている場合:

1。H:

#ifndef GUARD_1 
#define GUARD_1 
#define A 1 
#endif 

2.H行うことができます。

#undef GUARD_1 
#undef A 

と同じ効果を引き起こします。

Now to stdlib.h

#include <stdlib.h> 
#include "x.h" 
#include <stdlib.h> 

#include <stdlib.h> 
#include "x.h" 

NULL未定義

そして、これを持っています:今

#undef _STDLIB_H // Kill the include guard of stdlib.h 
#undef NULL  // Undefine some important symbol from stdlib.h 

、このシーケンス:あなたのXHでヘッダをこのようなものを構成することができますそれが定義されます。

4

標準ヘッダーを複数回含めることは全く必要ありませんが、何度も邪魔になることはありません。

C standard saysこれについて以下

標準ヘッダーは、任意の順序で含まれていてもよいです。それぞれ が含まれている効果とは異なり、<assert.h> を含む効果がNDEBUGの定義に依存することを除いて、与えられた有効範囲内に複数回含まれてもよい( )。

0

<stdlib.h>には直接適用できませんが、ユーザー定義のヘッダーファイルを2回インクルードする理由:ヘッダーファイルを2回インクルードすると問題が発生します。

例:

など、種類、定義、ファイルfoo.hfoo.cfoo_機能の束を宣言し、実装のペアを考えてみましょファイルfoo.c

#include "foo.h" 
#include "foo.h" 

rest of foo.c code ... 

インクルードファイルの2番目の呼び出しすべき問題は発生しません。foo.cがそれをテストします。
OTOH、foo.cヘッダーファイルを1回だけ含めることがOKであるかどうかはテストされませんでした。

関連する問題