2016-04-24 6 views
4

はなぜ時々私はC言語でなぜ#空のマクロを定義しますか?

#define __Empty_macro__ 

を参照してください?それの使用法は何ですか? ex。

#ifndef _BUILDIN_H_ 
#define _BUILDIN_H_ 
//codes never used _BUILDIN_H_ ... 
#endif /* _BUILDIN_H_ */ 

元のソースは、シェルが実装されていますCC++プログラミング言語でhttps://github.com/dingdongnigetou/shell/blob/master/include/build_in.h

+4

[なぜ#ifndefと#defineがC++ヘッダーファイルで使用されているのですか?](http://stackoverflow.com/questions/1653958/why-are-ifndef-and-define-used-in-c-header -files)編集:この質問はもともとC++にタグ付けされていました。質問への答えは、私が知っている限り、C++とCの場合と同じですが、既に重複して回答しています。 – user2079303

+1

よく私はこれらの未定義の動作を – user3528438

+0

@ user3528438と呼びますが、何に基づいてそれらの未定義の動作を呼びますか? – StoryTeller

答えて

2

を、#includeガードを、時にはmacro guardと呼ばれる、を扱うときdouble inclusionの問題を回避するために使用される特定の構造ですincludeディレクティブヘッダファイルに#includeガードを追加することは、そのファイルを冪等化する1つの方法です。たとえば、あなたがchild.hファイルにgrandfather.hfather.hヘッダファイルを含めることを検討してください。

ファイル "grandfather.h"

#ifndef GRANDFATHER_H 
#define GRANDFATHER_H 

struct foo { 
    int member; 
}; 

#endif /* GRANDFATHER_H */ 

ファイル "father.h"

#include "grandfather.h" 

ファイル "child.c" ここ

#include "grandfather.h" 
#include "father.h" 

"grandfather.h"の最初の包含は、マクロGRANDFATHER_Hが定義されるようにします。次に、 "child.c"にfather.hを含めることによって2回目の "grandfather.h"(father.hにはgrandfather.hが含まれます)が含まれる場合、#ifndefテストはfalseを返し、プリプロセッサーはファイルgrandfather.hの#endifまでスキップします。 struct fooの2番目の定義です。そしてプログラムは正しくコンパイルされます。

3

それらを使用するためのさまざまな理由があります。 たとえば、ライブラリを1回だけ含める必要がある場合。マクロを定義することができます。次に、そのマクロが定義されているかどうかをチェックして、インクルードをスキップします。等々。

ここについての説明があります:inclusion guard

6

「空のマクロが」依然として存在し、彼らが#ifdefまたは#ifndefを使用して存在するかどうかを確認することが可能になるので。

典型的には、この動作は、(あなたの例があるものであり、別名「警備員を含む」)が含まれている同じヘッダーの複数のコピーを防止するために使用されます。ただし、プログラムの特定部分を条件付きで含めるために使用することもできます。

NDEBUGまたは_DEBUGなどのマクロは、最終製品では望ましくない高価なランタイムチェックを含めるなど、プログラム出力を変更することがありますが、開発中のバグを追跡するのに役立ちます。

カスタム "空"定義は、プログラムビルドから特定のバイナリ機能を組み込むか、または除外するのと同様に使用できます。これは、パフォーマンス(ログの削除)、セキュリティ(プログラムの重要な部分の削除)、ビジネス上の理由(一部の機能ではプログラムのより高価なバージョンが必要な場合があります)などで実行できます。

+1

意味のある拡張がない場合に便利なフォールバックも提供します。たとえば、ヘッダに移植性のある 'DLL_EXPORT'仕様を定義しようとしているときです。 – StoryTeller

関連する問題