0

我正在编写一个应该有两个版本的函数:调试版本和非调试版本。使用这两个函数中的哪一个应该由调用者决定。

我想要这样的东西:

调用者.c

// comment out the following line when not necessary anymore
#define MY_FUNC_DEBUG

#include "my_func.h"

// some code that calls my_func()

my_func.h

void my_func(void);

my_func.c

void my_func()
{
    // lots of code

#ifdef MY_FUNC_DEBUG
    // debug code
#endif

    // more code
}

这显然是行不通的,因为 my_func.c 与 caller.c 是分开编译的,因此它不知道它定义了哪些宏。

我怎样才能轻松完成这项工作?我不想分别编写这两个版本my_func,因为它们共享大部分代码。

4

2 回答 2

1

假设您使用的是 gcc,则可以通过在编译时通过-D两个文件中的选项定义宏来轻松解决此问题。

-D MY_FUNC_DEBUG在您的示例中,您可以在想要激活调试代码时编译这两个文件,否则什么也不做。不需要MY_FUNC_DEBUG在 caller.c 中定义。

于 2013-11-10T23:27:09.513 回答
0

使调试代码在my_func()运行时可切换。

my_func.h

#ifndef MY_FUNC_H_INCLUDED
#define MY_FUNC_H_INCLUDED

extern int my_func_debug(int level);
extern void my_func(void);

#endif

my_func.c

#include "my_func.h"

static int debug = 0;

int my_func_debug(int level)
{
    int rv = debug;
    debug = level;
    return rv;
}

void my_func(void)
{
    ...
#ifdef MY_FUNC_DEBUG
    if (debug)
        ...debug...
#endif
    ...
}

调用者.c

void consumer(void)
{
    int old = my_func_debug(9);
    my_func();
    my_func_debug(old);
}

讨论

大纲代码意味着您可以拥有一份源代码副本my_func.c,但可以在包含调试的情况下进行编译,也可以将其排除在外。消费者代码 ( caller.c) 可以请求它想要的调试级别,但这是否有用取决于my_func.o(my_func.obj在 Windows 上) 的副本是否在编译时包含调试。你得到一个源文件;您可以选择包含在程序中的目标文件的哪个变体caller.o。在运行时,您可以请求调试。

注意my_func_debug()是无条件定义的;如果my_func.c代码不是用-DMY_FUNC_DEBUG.

于 2013-11-11T01:06:23.823 回答