多个文件中的#ifdef问题

时间:2013-11-29 21:51:39

标签: c logging macros c-preprocessor conditional-compilation

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.hfoo.c的顶部,这两者都比我想要的更加混乱。

我在这里缺少什么?我认为.c文件中定义的宏在其包含的所有.h文件中都是可见的。

3 个答案:

答案 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宏