1

GNU / Linux上のGCCによって生成された共有オブジェクトライブラリに関連して、プリプロセッサがどのように機能するかについてもう少し調べようとしています。

私はこれに対する明確で簡潔な答えを見つけることができませんでした。

次のようなプリプロセッサステートメントを使用する場合:

#ifndef __OPTI_MY_VARIABLE
#define __OPTI_MY_VARIABLE 1
#endif

そして、これを使用して共有オブジェクトファイルをコンパイルし、次のように宣言した別のプログラムにリンクします。

#define __OPTI_MY_VARIABLE 2

共有オブジェクトライブラリを使用するメインプログラムをコンパイルした後、私のプログラムは値1または2を使用しますか?

値1を使用する場合、たとえばプリプロセッサステートメントを使用しないなどして値2を使用するようにコードを構築する方法はありますか?言い換えると、同じ名前の別のグローバル変数がデフォルト値をオーバーライドしない限り、デフォルト値を宣言する方法はありますか、またはこの情報を共有オブジェクトの関数に渡す必要がありますか?

4

2 に答える 2

3

#defines は、プリプロセッサによってのみ認識されます。プリプロセッサは、コンパイラの前に完全に実行されます。コンパイラはリンク前に実行されます。

共有オブジェクトの「内部」でデフォルト値をオーバーライドできるようにしたい場合は、セッター関数と静的グローバル変数を使用することをお勧めします。

#define OPTI_MY_VARIABLE_DEFAULT   1

static int opti_my_variable = OPTI_MY_VARIABLE_DEFAULT;

...

void set_opti_my_variable(int i) { opti_my_variable = i; }

明らかに、これは多くの人が眉をひそめているグローバル変数を使用しています...

于 2012-06-21T00:02:16.087 に答える
0

質問は間違っています。

これらの定義は、ソースコードで、定義名のすべての出現箇所が、コンパイルの前に指定された値に置き換えられることを意味します。

したがって、一方の共有ライブラリでは、その名前がどこにあっても、値は1になります。もう一方の共有ライブラリでは、値2になります。その名前は、共有ライブラリには存在しません。単一のプログラムで両方の共有ライブラリーを使用する場合、定義名が設定された最初のライブラリーの変数はすべて値1になり、2番目のライブラリーの変数は値2になります。

于 2012-06-21T10:23:26.593 に答える