0

デバッグ バージョンと非デバッグ バージョンの 2 つのバージョンが必要な関数を作成しています。2 つの関数のどちらを使用するかは、呼び出し元が決定する必要があります。

私はこのようなものが欲しい:

caller.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の 2 つのバージョンを別々に書きたくはありません。コードの大部分を共有しているためです。

4

2 に答える 2

1

-Dgcc を使用していると仮定すると、この問題は、両方のファイルのオプションを介してコンパイル時にマクロを定義することで簡単に解決できます。

あなたの例では-D MY_FUNC_DEBUG、デバッグコードをアクティブにしたいときに使用して両方のファイルをコンパイルし、それ以外は何もコンパイルできません。MY_FUNC_DEBUGcaller.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
    ...
}

caller.c

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

討論

アウトライン コードは、 のソースのコピーを 1 つ持つことができることを意味しますがmy_func.c、デバッグを含めてコンパイルすることも、デバッグを除外してコンパイルすることもできます。コンシューマー コード ( caller.c) は、必要なデバッグ レベルを要求できますが、それが役に立つかどうかは、my_func.o( my_func.objWindows の場合) のコピーがデバッグを含めてコンパイルされたかどうかによって異なります。1 つのソース ファイルを取得します。を使用して、オブジェクト ファイルのどのバリアントをプログラムに含めるかを選択できますcaller.o。また、実行時にデバッグをリクエストできます。

my_func_debug()無条件に定義されていることに注意してください。my_func.cコードが でコンパイルされていない場合、あまり役に立ちません-DMY_FUNC_DEBUG

于 2013-11-11T01:06:23.823 に答える