1

C++ で未使用の関数を判別するコードの記述に関する質問に遭遇しました。さまざまなデータ構造を使用して、未使用の関数を特定できます。しかしその前に、コードを解析する必要があります。解析部分に関連する質問があります。関数の宣言と定義、および関数呼び出しをどのように区別できますか?

お気に入り、

 //function declaration without argument
 fun1 ();

 //function definition
 fun1 () {
   // code goes here
  }

 main () {
   fun1 ();
  }

上記の宣言と呼び出しは同じように見えますが、定義部分は宣言と呼び出しとは少し異なります。

上記のシナリオ以外に、関数と関数スコープを呼び出すための複数のシナリオがあります。たとえば、2 つのクラスが同じ名前の関数を持ち、1 つの関数がメンバー関数内で呼び出される (つまり、明示的な呼び出しオブジェクトは必要ありません)、またはオブジェクトを使用した関数呼び出しなど、理解する必要があります。最初にオブジェクトの型を調べて、実際に呼び出される関数を決定します。

解析を効率的に実装するにはどうすればよいですか? 上記のシナリオでは、何回の解析が必要ですか?

4

1 に答える 1

3

これはあなたがそれらを区別する方法です:

//function definition
return_type fun1 (args) {
  // code goes here
}

関数定義には、関数名の前に「戻り値の型」があることに注意してください。

また、関数宣言はその定義とまったく同じに見えることに注意してください。;または のいずれかが表示されるまで、実際にそれらを区別する必要はありません{。それが宣言か定義かを決定するポイントです。特定のアプリケーションでは、関数が実際に何をするかは気にしないので、あまり気にしません。

残念ながら、C++ は複雑です。どの関数が役に立たないかを判断するには、実際には少なくとも基本的な意味分析が必要です。これには、少なくとも型システムが含まれます。

さらに悪いことに、一部の関数は必ずしも直接呼び出されるとは限らず、仮想関数を介して呼び出される場合があります。したがって、コードの静的分析では、親の関数のみが呼び出されていることが示されていますが、実際には子の関数です。

于 2012-07-16T09:34:51.230 に答える