使用define控制每个源文件的宏编译

时间:2013-01-08 13:09:06

标签: objective-c c macros objective-c++ c-preprocessor

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

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

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都执行g,就像source1.cpp没有定义FOO一样。

3 个答案:

答案 0 :(得分: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"

修改

我有点快说宏观错了。根据此问题What is the value of an undefined constant used in #if? (C++)#if应按照OP的规定运作,因为FOO的值在未定义时应衰减到0

但是我认为使用#ifdef提供了更多关于实际需要的背景。

因此,我怀疑FOO的定义是在某处意外偷偷摸摸。

答案 1 :(得分: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)?
}

您可以通过以下几种方式实现。 希望这会有所帮助。

答案 2 :(得分:0)

问题是标题毕竟是间接包含在预编译头文件中的。 XCode似乎自动将预编译头包含在每个编译单元中,因此只有一个版本的宏可用。预编译的版本是没有定义的版本,即#send-branch,因为在预编译时没有读取源文件。

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

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