-1

プログラムのセクションを単体テストしやすくするために、オペレーティング システムのプリミティブ (つまり、クリップボード ターゲットのセットを提供できることを報告する関数) を指すことができる関数のテーブルを取るようにしたいと思います。テスト版。理想的には、ライブ バージョンに関数テーブルのオーバーヘッドを持たせたくありませんが、それがコードに役立つ追加の構造だけです。したがって、ルックアップを最適化できるように、関数テーブルが変更されないことをコンパイラに伝える何らかの方法が必要です。このようなもの(説明のための単純な実装):

#ifndef TEST
const
#endif
static struct {
    void (*reportTargets)(size_t targetc, const char **targetv);
    [...]
} interfaceToOutside
#ifndef TEST
= {
    reportTargetsLive,
    [...]
}
#endif
;

これはトリックを行う可能性が高いですか、これを達成する方法についての良い提案がない場合 (またはそれを改善する方法) はありますか?

4

2 に答える 2

0

したがって、関数テーブルが変更されないことをコンパイラに伝える何らかの方法が必要です (...)

さて、すべてを宣言します(ところで、最初のものをとの間にconstインターリーブする必要があります):conststaticstruct

#ifndef TEST
# define CONST const
#else
# define CONST 
#endif

static CONST struct {
    void (*CONST reportTargets)(size_t targetc, const char **targetv);
    [...]
} interfaceToOutside
#ifndef TEST
= {
    reportTargetsLive,
    [...]
}
#endif
;

#undef CONST

(マクロ名が悪いです、私は知っています)。

今、

これはトリックを行う可能性が高いですか(...)?

と思いますが、生成されたアセンブラ コード ( /-Sのオプション) を確認する必要があります。gccg++

于 2013-06-03T09:27:46.897 に答える