質問
次のものがある場合:
/*
* example.h
*/
#ifndef EXAMPLE
#define EXAMPLE
#include <stdio.h>
extern int parse_string(FILE *, char const*, const unsigned int);
#endif
これは、... #include example.h
...を使用するコードが... #include <stdio.h>
の...依存関係を必要としないことを意味しますか? (例:<=>)
解決
正しい-これが、他のヘッダーに含まれる必要なヘッダーを制限することをお勧めする理由です。プリプロセッサは<!> quot; #include <!> quot;を置き換えます。 stdio.hの内容を持つディレクティブ、 そのため、コンパイラーにはヘッダーは次のようになります。
/*
* example.h
*/
#ifndef EXAMPLE
#define EXAMPLE
<contents of stdio.h>
extern int parse_string(FILE *, char const*, const unsigned int);
#endif
他のヒント
はい
ただし、コードが<stdio>
に依存する場合は、おそらくそれを含める必要があります。 (結局、<=>には複数の包含保護もあります。)
プロジェクトのマスターインクルードが必要な場合は、実際にヘッダーを作成しますが、実際のヘッダーと一般的なシステムヘッダーの両方を含めますが、プロトタイプや宣言またはマクロは含めません。つまり、メガインクルードにはインクルード以外の何もさせません。このようにして、個々のモジュールはプログラムの進化に合わせて独自の決定を下すことができます。
はい、あなたはそれを行うことができ、それは望ましい効果をもたらします。
特定の例では、<!> lt; stdio.h <!> gt;でFILE
を宣言する必要があるため、含めることをお勧めします。
parse_string()プロトタイプがsize_t
の代わりにunsigned int
およびconst char *
の代わりにFILE *
(ファイル名の場合)を使用した場合、<!> lt; stddef.h <!> gt;を含めます。 <!> quot; example.h <!> quot;
#ifndef EXAMPLE
#define EXAMPLE
#include <stddef.h> /* size_t typedef */
extern int parse_string(const char *filename, char const*, const size_t);
#endif