2

是否可以通过在源文件中使用定义在两个不同的源文件中以不同方式编译头文件?

例如,如果我在两个源文件中包含一个标头,如下所示:

标头.h:

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

源1.cpp:

#define FOO 1
#include "header.h"

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

源代码2.cpp

#include "header.h"

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

这不应该编译以便函数 a 执行 f 而函数 b 执行 g 吗?

我正在尝试在 XCode 和 Objective-C++ 中执行此操作。a 和 b 都执行 g,就好像 source1.cpp 没有定义 FOO 一样。

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++)应该按照 OP的#if规定工作,因为FOO应该衰减到0未定义时的值。

但是,我认为 using#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

源1.cpp:

#define FOO
#include "header.h"

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

源代码2.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

并这样写:

源1.cpp:

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

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

源代码2.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 似乎自动将预编译的头文件包含在每个编译单元中,因此只有一个版本的宏可用。预编译的版本是没有定义的版本,即#else-branch,因为在预编译时没有读取源文件。

我会接受彼得 M 的回答,因为他对此得出了正确的结论。

askmish 的切换方法对我的情况没有帮助,但这是我将来会这样做的方式,因为这会立即导致解决方案。

于 2013-01-08T15:14:20.833 回答