util.h
包含以下代码:
#ifdef DEBUG
#define LOGGER() MACRO_WRAP(printf("Entering %s\n", __func__))
#else
#define LOGGER() MACRO_WRAP()
#endif
foo.c
包含以下代码:
void foo_start(foo *m)
{
LOGGER();
do_action(m, START);
}
然后foo_unit_tests.c
包含对foo_start()
的调用。我希望能够#define DEBUG
位于相关文件的顶部 - 即我希望它可以打开单元测试,但不能用于主代码。
我无法让它发挥作用。将#define DEBUG
放在foo_unit_tests.c
的顶部不会产生所需的行为。我能让它发挥作用的唯一方法是将#define DEBUG
置于util.h
或foo.c
的顶部,这两者都比我想要的更加混乱。
我在这里缺少什么?我认为.c
文件中定义的宏在其包含的所有.h
文件中都是可见的。
答案 0 :(得分:2)
您必须在所有需要定义宏的文件的开头加#define
,或者在其中包含一个.h
文件。
如果您想要更简洁的方法,那么最好使用编译器标志来设置环境变量。
例如
icpc -DDEBUG=whatever source.c ...
或者甚至更好,您可以通过makefile中的环境变量启用此编译器标志。
答案 1 :(得分:0)
foo_unit_tests.c很可能不包含foo.c,因此在编译foo_unit_tests.c时从未见过#define
答案 2 :(得分:0)
在某处定义你的普通记录器..在单元测试中..
#undef LOGGER()
#define LOGGER(x) fprintf(stdout, x)
或者你也可以这样做:
#ifdef UNITTEST
#define LOGGER ...
#else
#define LOGGER ...
#endif
并在构建测试时从构建env传入UNITTEST宏