C/C++ コードの ifdef に直面して、標準コード複雑度メトリック (LOC、McCabe 循環的複雑度、Halstead メトリックなど) がどのように計算されるのか疑問に思っていました。
ifdef を無視すると、次のような構文エラー (または型エラー) が発生する可能性があります。
- #ifdef FOO
- for(i = 0; i < x; i++) {
- #そうしないと
- for(i = 0; i < y; i++) {
- #endif
- printf(...)
- }
行 1、3、および 5 が無視されると、結果のコードには 1 つのループが別のループの内側にあり、'}' が欠落しています (したがって、構文エラー)。
#ifdefs が考慮される場合、バリアントごとに 1 つの結果メジャーが必要になります (この場合、FOO が定義されている場合に 1 つ、FOO が定義されていない場合にもう 1 つ)。ただし、このようなアプローチは、実際には簡単に爆発する可能性があります。
http://manpages.ubuntu.com/manpages/natty/man1/pmccabe.1.htmlを見ると、マンページは次のように報告しています。
pmccabe の解析では、すべての cpp プリプロセッサ ディレクティブが無視されます - プリプロセッサがコードをマングルした後の複雑さではなく、コードの外観の複雑さを計算します。getchar(3) のような単純なものがマクロに展開され、複雑さが増すため、これは特に重要です。
しかし、前述したように、この方法ではコード エラーが発生し、計算プロセスが妨げられたり、誤った値が返されたりする可能性があります。
ツールはこの問題をどのように克服しますか?
よろしく。