2016-08-18 1 views
3

開発とテストに非常に役立ちますが、パフォーマンス上の理由から生産性コードの一部であるべきではありません。私たちの目標は、コンパイラにDEV_ONLYとマークされた関数が同じタグを持つ関数によってのみ呼び出されることを保証することです。 DEV_ONLYは、マクロまたは何か他のものであることを他の開発者関数によってのみ呼び出すことができるC++開発者関数

virtual int foo() DEV_ONLY; 

int bar() { 
    foo(); // fails 
} 

int blah() DEV_ONLY { 
    foo(); // works 
} 

どのように私はのようなものを実装するのでしょうか?

次のアイデア

は、これまでに提案されてきたが、私は探していますされていない完全にどのような揮発性

  • :私が見つけた1つのオプションは、(see Dr. Dobbs)「揮発性」としてそれらをマークすることでしたが、私は持っていますその2つの問題。まず、異なるセマンティクスを持つ指定子を誤用し、将来的に問題を引き起こす可能性があります。第2に、関数が「揮発性」であることに関するコンパイラの警告はそれほど有用ではないでしょう。

  • friend:私の理解では、このような方法を実装しているクラスでは友だちを宣言する必要があります。この方法を使用するテストや開発ツールはあらかじめわかっていないので、私は友人の解決策の友人ではありません。

  • エクスポートしない:メソッドを使用する場合と使用しない場合があるコードは、同じクラス内であっても可能です。

  • リリースビルドでnoopに置き換えてください。テストでは、まだリリースモードでこれらのメソッドが必要な場合があります。

+1

何についてではない:それはあなたのような何かを与えるだろうそれらをエクスポートしますか? – Ceros

+1

これに 'friend'shipを使うことができるかもしれません。 – Bathsheba

+4

'#ifdef DEV_ONLY'?または専用ライブラリを作成する:DevOnlyLib? – Jarod42

答えて

1

#ifdefプリプロセッサディレクティブは、あなたの目標のうちの2つを達成するための最も簡単な方法のようになります。

  • は、任意の産生コード
  • の一部ではない、彼らはだけで関数から呼び出すことができることを確認してください同じ "タグ"(存在しない場合は、DEV_ONLY未定義のビルドはコンパイルされません)

これは、関数本体を次のようにラップすることを意味します。対応する呼び出しとして使用します。

リリースビルドで使用可能なテスト方法について:DEV_ONLYではないため、マークする必要はありません。

+0

これは今のところ最高の解決策であると私は感じています。しかし、私は、リリースモードでプロジェクトをビルドするときだけでなく、コンパイラがすぐに不平を言う方法があることを願っています。 – mrks

0

これに対処する1つの方法は、ライブラリのみをテストとして定義し、プロダクションバイナリでそれらを使用することを制限するビルドシステムを使用することです。たとえば、bazelはtestonlyオプションを提供します(http://bazel.io/docs/be/common-definitions.html#common.testonly

次に、メインバイナリ/ライブラリ、テスト専用ライブラリ、およびテストコードにコードを整理します。 cc_library( 名= "foo" という、 SRCS = [ "foo.cc"]、 HDRS = [ "foo.hという"]、 )

cc_library(
    name = "test-utils", 
    srcs = ["test-utils.cc"], 
    hdrs = ["test-utils.h"], 
    testonly = 1, 
) 

cc_test(
    ... 
    deps = ["foo", "test-utils"], # works 
) 

cc_libaray(
    ... 
    deps = [..., "test-utils"], # fails 
) 

cc_binary(
    ... 
    deps = ["test-utils"], # fails 
) 
関連する問題