2011-07-11 10 views
1

にファイルスコープシンボルを定義するために、#defineディレクティブは、シンボルを定義する方法、例えば、次の行がシンボル「デバッグ」定義:C#のC++

#define DEBUG 

このシンボルの範囲でありますそれが定義されているファイル。

C++では、前処理シンボル(/ D "DEBUG")を定義して同じ効果を得ることができます。しかし、/ Dはプロジェクト全体の設定スイッチです。

私の質問は、C++でファイルにローカルなシンボルを定義する方法ですか?

+1

"C++では、前処理シンボル(/ D" DEBUG ")...プロジェクト定義スイッチ"です。これは一般的なC++のことではなく、むしろコンパイラ固有のものであり、使用されているツールを組み込んだものです。あなたはMSVC++と思われます。とにかく、他のC++のメカニズムが(GoogleがC++のFAQをよく分からない場合は)同じように適用できる場合、 '#define'はお勧めできません。また、OrbWeaverの回答文書には最良の選択肢があります。 –

+0

私の間違った仮定を指摘してくれてありがとう。私は間違った方法で質問したと思います。私がしたいのは、#ifdefディレクティブでテストできる "DEBUG"シンボルを定義することです。定義されていれば、診断メッセージをコンソールに出力します。そして、私はC++で、#defineディレクティブは基本的に "#define MAXVALUE 99"のようなテキスト置換を行うことに気付きました。もし私が "#define DEBUG"を私のcppファイルの先頭で使用すると、後で "#ifdef DEBUG"はまだfalseに評価されます... "#define DEBUG"は私が期待することをしないと思います。私が間違っているかどうか教えてください。 – kennyzx

+0

ああ、私は "#define DEBUG"が "#define DEBUG"の直後に "#ifdef DEBUG"がまだfalseに評価されているのを見つけたので、プロジェクト設定で混乱し、今は期待どおりに動作します。助けてくれてありがとう... – kennyzx

答えて

7

#define(CおよびC++で使用可能ですが、シンボルを作成しません)は、プリプロセッサマクロを作成します。これは、コンパイラがソースファイルを参照する前に行われるテキスト置換処理です。

C++ファイルでファイルローカルシンボルを作成する通常の方法は、匿名の名前空間を使用することです。

namespace 
{ 
    const int SOME_LOCAL_INT = 3; 
    const std::string SOME_LOCAL_STRING("Blah"); 
} 

匿名名前空間を使用すると、シンボルが定義されているコンパイル単位の外側に表示されないことが保証されます。ただし、ヘッダーファイル内に匿名の名前空間を定義すると、そのヘッダーファイルを含むすべてのC++ファイル内に含まれるシンボルのコピーにアクセスできるため、匿名の名前空間を.cppファイル内に配置して、彼らは確かに地元である。

+2

名前空間を持たない静的なグローバルメンバーにも同じことが適用されます – Ulterior

+3

*ヘッダーファイル内で匿名の名前空間を定義すると、そのヘッダーファイル*を含むすべてのC++ファイル内に含まれるシンボルにアクセスできます。それはまったく真実ではありません。異なる識別子の同じバージョンが利用可能になります。各翻訳単位には、それ自身の 'SOME_LOCAL_INT'があります。これはその翻訳単位に対してローカルになります。名前が付けられていない名前空間内の変数を変更することは、他の翻訳単位のコードには見られないため、これは定数では重要です。 –

+0

@David Rodriguez - 良い点、明確にするために編集。 –

2

あなたがにしたい場合は、必ずしも以下のように使用し、その後、そのヘッダーにローカルであるために、シンボルのヘッダで使用#define

//file.h 
#define DEBUG 
//... code 
#undef DEBUG // clearing the symbol 

#undefは、以前に定義されたDEBUGを未定義ます。したがって、#includeの場合はfile.hとなります。のローカルアドレスはfile.hのようになりません。