2017-05-11 5 views
1

私はいくつかのクラス(すなわちClassXClassYなど)へのルーチンを提供していますライブラリ(MyLib.hMyLib.cpp)をしました。 はMyLib.hに私は#defineプリプロセッサディレクティブを使用して、2つの定数を定義している:私は、各文字列を使用したいところ設定したアクセス修飾子++の#define CONSTANT_NAME constant_value

#define LOCAL_STR "this string can not be shared among classes that don't #include "MyLib.h"" 

#define TOSHARE_STR "this string can be shared among classes that #include "MyLib.h"" 

両方の文字列値を示唆しています。私の考えでは、第1のものはMyLib.cppコードでのみ使用し、第2のものはClassX,ClassYなどのコード内で使用する必要があります。

C++は、これらの2つの定数の望ましい可視性を定義する方法を提供しますか?現在、どこにでも表示されています...

+1

クラスは、物事を#includeしていないIFDEFブロックをそれらを定義することができますいずれかのいくつかの共有のものが必要な場合は、翻訳単位で行います。 #defineは定数ではなく、テキスト置換ルールです – Caleth

答えて

1

あなたLOCAL_STRのに#defineのみMyLib.cppで使用されていることを確認する簡単な方法は、むしろMyLib.h

2

このようにプリプロセッサーの機能は、#define d個の定数にすることで使用しています。このメカニズムを使用すると、定義を含むどのモジュールにも表示されます。あなたが本当に何をしたいのか

は、関連するクラスの定数文字列(std::stringまたはconst char*)を宣言し、彼らがアクセスされる方法を制御するための可視性を制御しpublicprotectedprivateを使用しています。

2

短い回答:いいえ。

文字列リテラルは、静的記憶期間の正式に一定の配列です。コンパイラが定義の可視性を持っている限り、それらの使用場所を制御する手段はありません。そして、そのアドレス(またはそれらの要素のいずれかのアドレス)は、任意の関数に引数として渡すことができます。

プリプロセッサマクロはスコープとは独立していますが、それぞれのコンパイル単位に、#defineからコンパイル単位の末尾までまたは対応する#undefのいずれか早い方のどちらかに存在します。

これは、ヘッダが#includeであるコンパイル単位が、両方のマクロと両方の文字列リテラルの可視性を持つことを意味します。

代替メカニズムがあるため、C++(インクルードガードを除く)ではマクロを使用することがよくありません。文字列へのアクセスを制御したい場合は、クラスの名前付きメンバにし、適切なアクセス制御を行います。ヘッダーファイルで宣言されたマクロと文字列リテラルを使用する代わりに。

0

よりも、そこにそれを置くために、とにかく、プリプロセッサがどのように動作するかではありませんされていることを、あなたはコンパイルでき

hello.h

#ifdef PREPROCESSING 
    #define STR "this is only seen in hello.c" 
#endif 

のhello.c

:各ソースはseparetely、あなたのようなものを持っている可能性があり、代わりに、一度にすべてのファイルをコンパイルするマクロで、コンパイラを供給するので、
#include "hello.h" 
/* STR == "this is ...." */ 

これは、-cフラグを持つオブジェクトとしてコンパイルすることができ、 "PREPROCESSING"をマクロ(-Dオプション付き)として渡すと、helloのifdefに渡されます。時間はこの後

gcc -c -DPREPOROCESSING hello.c -o hello.o 

あなたの文字列を定義し、渡します、あなたはそれらのそれぞれは、それらを共有することなく、それ自身のマクロを定義していますが、一緒にいくつかの.oファイルをリンクすることができます。

あなたはまだ別の.hファイルを使用するか、

関連する問題