4

C++ では、宣言されたときに関数ポインターとして自動的にマップ (またはベクトル、この場合は重要ではありません) に追加され、後で自動的に呼び出される関数を作成したいと考えています。たとえば、ユニット テスト フレームワークを作成していて、ユーザーに各ユニット テストを次のように宣言させたい場合に便利です。

UNIT_TEST_FUNCTION(function_name){

// do something 

}

代わりに、このようなものが呼び出されます

void function_name(){
  //do something
}
int temp = register_function("function_name", function_name); 

たとえば、 register_function() は、関数ポインターのマップにユーザー定義関数を追加します。したがって、基本的には、関数定義の後にコード行を追加して、定義された関数に対して何らかのアクションが自動的に実行されるようにするメカニズムが必要です。おそらくマクロを使用してこれは可能ですか?

4

2 に答える 2

7

マクロは、連続したテキスト ブロックのみを生成できます。質問で示した方法で物事をレイアウトすることはできません。

ただし、少しだけ再配置する気があれば、それは可能です。

#define UNIT_TEST_FUNCTION(function_name) \
    void function_name(); // forward declaration \
    int temp##function_name = register_function(#function_name, function_name); \
    void function_name()
于 2013-02-28T18:13:43.503 に答える
1

1 つのプリプロセッサ マクロでは、1 つの連続したテキスト ブロックしか生成できないため、目的の処理を実行できません。プリプロセッサ マクロは、言語について何も理解していないという意味で愚かです。したがって、 「プリプロセッサマクロ」のプリプロセッサです。

できることは、マクロのペアまたはマクロのタプルを使用して、テスト ケース マッピングの開始と終了を区切り、個々のテスト ケースごとに 1 つのマクロを使用することです。これらの行に沿ったもの:

TEST_CASES_BEGIN

UNIT_TEST_FUNCTION(function_name){

// do something 

}

TEST_CASES_END

Boost 単体テスト機能は、これと非常によく似たメカニズムを使用します。(最終的には) このデザインが、達成しようとしているデザインよりも少し表現力豊かであることに気付くかもしれません。

于 2013-02-28T18:14:53.800 に答える