通过在源文件中使用定义,是否可以在两个不同的源文件中编译头文件?
例如,如果我在两个源文件中包含一个标头,如:
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一样。
答案 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方法在我的情况下没有帮助,但这就是我将来会这样做的方式,因为这会立即导致解决方案。