2

ソース ファイルの定義を使用して、2 つの異なるソース ファイルでヘッダー ファイルを異なる方法でコンパイルすることは可能ですか?

たとえば、次のように 2 つのソース ファイルに 1 つのヘッダーが含まれているとします。

header.h:

#if FOO
#define BAR(x) f(x)
#else
#define BAR(x) g(x)
#endif

source1.cpp:

#define FOO 1
#include "header.h"

void a(int x) {
    BAR(x); // f(x)?
}

source2.cpp

#include "header.h"

void b(int x) {
    BAR(x); // g(x)?
}

これは、関数 a が f を実行し、関数 b が g を実行するようにコンパイルすべきではありませんか?

XCode と Objective-C++ でこれを実行しようとしています。a と b の両方が、あたかも source1.cpp が FOO を定義していないかのように g を実行します。

4

3 に答える 3

2

マクロが正しく定義されていません。 間違いはそれがあるべきであるということですしかし私は使用することを好み#ifdefます#if

#ifdef FOO
#define BAR(x) f(x)
#else
#define BAR(x) g(x)
#endif

さらに、あなたはFOO価値を与える必要はありません、あなたがする必要があるのはそれをする#defineことだけですsource1.cpp

#define FOO
#include "header.h"

また、次のようにして、(他のインクルードからのキャリーオーバーとして)定義されていないsource2.cppことを確認します。FOO

#ifdef FOO
#undef FOO
#endif
#include "header.h"

編集

マクロが間違っていたとすぐに言いました。このSOの質問によると、#ifで使用される未定義の定数の値は何ですか?(C ++)#if、OPによって指定されたとおりに機能する必要があります。これは、の値が定義されていない場合にFOO減衰するためです。0

#ifdefただし、使用すると、実際に何が望まれるかについて、より多くのコンテキストが提供されると思います。

したがって、の定義がFOO予期せずどこかに忍び込んでいるのではないかと思います。

于 2013-01-08T13:15:14.010 に答える
0

あなたの場合、マクロに基づいて区別する最良の方法は、トグル メソッドを使用することです。

#ifdef FOO
#define BAR(x) f(x)
#undef FOO
#else
#define BAR(x) g(x)
#endif

source1.cpp:

#define FOO
#include "header.h"

void a(int x) {
    BAR(x); // f(x)?
}

source2.cpp

#undef FOO
#include "header.h"  
void b(int x) {
    BAR(x); // g(x)?
}

さらに制御するには、これを試してください:

#ifdef FOO
  #if FOO == 1
  #define BAR(x) f(x)
  #undef FOO
  #elif FOO == 2
  #define BAR(x) g(x)
  #undef FOO
  #endif
#endif

そして、次のように書きます。

source1.cpp:

#undef FOO
#define FOO 1
#include "header.h"

void a(int x) {
    BAR(x); // f(x)?
}

source2.cpp

#undef FOO
#define FOO 2
#include "header.h"  
void b(int x) {
    BAR(x); // g(x)?
}

あなたが求めたものを達成する方法はいくつかあります。お役に立てれば。

于 2013-01-08T14:07:05.493 に答える
0

問題は、ヘッダーがプリコンパイル済みヘッダーに間接的に含まれていたことです。XCode はすべてのコンパイル ユニットにプリコンパイル済みヘッダーを自動的に含めるように思われるため、1 つのバージョンのマクロしか利用できませんでした。プリコンパイルされたバージョンは、定義のないバージョン、つまり #else-branch でした。これは、プリコンパイル時にソース ファイルが読み込まれていないためです。

彼がこれについて正しい結論に達したので、ピーターMの答えを受け入れます。

私の場合、askmish によるトグル メソッドは役に立ちませんでしたが、すぐに解決策につながるため、将来的にはこの方法を使用します。

于 2013-01-08T15:14:20.833 に答える