4

私たちのコードにはそのようなものがあるのではないかと疑っています。

おそらく#ifdefなしの 、またはおそらくなし#endifの名前空間 foo 、何十万ものファイルを持つコードベースでそのようなものを見つけるためのいくつかの戦術は何ですか?正規表現を使用する方法はありますか?{}

編集 - 言及するのを忘れていました(これは本当に悪い部分です)、このコードで生成されたユニティファイルと呼ばれるものがあり、すべての単一のcppファイルを1つの大きなスーパーcppファイルにプルします。したがって、コンパイラーは、次の数億行のコードに簡単に実行できるため、中括弧の欠落やelse/ifの不一致についてはおそらく報告しません...

4

7 に答える 7

1

2 段階のプロセス:

  1. 通常のビルド (恐ろしいユニティ ビルドではない) を使用して、エラーを特定します。
  2. コンパイラが適切なフラグでエラーをキャッチしない場合は、別のフラグに切り替えます

スマート コンパイラを使用すると、unity ビルドでも動作することに注意してください。

Clang で使用-Wscopeすると、スコープ (名前空間など) がファイル (ヘッダーなど) で始まり、そこで終わらない場合に警告が表示されます。これを導入したパッチは、メーリング リストで見つけることができます。3.1 リリースで利用可能になります。

Clang には、プリプロセッサ ディレクティブに相当するものはないと思います。

于 2012-04-11T15:38:11.360 に答える
1

膨大なコードベースでぶら下がっている名前空間またはプリプロセッサ ディレクティブを見つける方法

Visual Studio で押すとCtrl+]、カーソルが一致するブレースまたは endif ステートメントにジャンプします。カーソルがジャンプできないブレースを見つけた場合、それは「ぶら下がっています」。さらに、コードの一部を折りたたむことができるため、一致しないブレースを見つけるのに役立ちます。

エラーリストではなく、実際のコンパイラ出力を読むこともお勧めします。

何十万ものファイルで

最初のエラーでコンパイルを終了し、エラーの原因となったファイルを調査し、エラーを修正して、再度コンパイルを試みます。「ソリューションのビルド」の代わりに「コンパイル」を使用して、一度に 1 つのファイルをコンパイルします。インクルード ファイル (VS2008 cl.exe の /E または /P スイッチ) を挿入した出力リストを生成するようコンパイラに "要求" し、結果のファイルを調査します。

それもうまくいかない場合は、python/perl で書かれた小さなパーサーを作成するのに時間を費やす必要があります。これは、中かっこの一致をチェックするパーサーです。

于 2012-04-11T14:00:27.810 に答える
0

答えは、1つのファイルに100000のファイルを(効果的に)貼り付けないことです。これにより、各ファイルがコンパイルされるときに、コンパイラーは、不一致が発生したときにすぐに認識します。次に、生成されたエラーメッセージと通常のコード検査を使用して、欠落しているディレクティブまたは中括弧を見つけるのは簡単なはずです。

于 2012-04-11T15:07:14.950 に答える
0

これはあなたの問題とは関係ないかもしれませんが、#if/#else/#endif ブロックでいくつかのヘッダー ファイルをフレーミングすると、「予期しない #else」エラーが発生しました。

問題のあるモジュールをプリコンパイル済みヘッダーを使用しないように設定すると、問題が解決することがわかりました。「#pragma hdrstop」に関係するものは、#if/#endif 内にあってはなりません。

于 2014-02-14T14:24:27.573 に答える
0

これは決して完全な答えではありませんが、次の正規表現を使用すると役立つことがわかりました。

// *\#if|\#el|\#en

// を検索し、任意の量の空白 (なしを含む) が続き、次に #if、#el、または #en (すべてのプラグマなどをスローする可能性を排除するため) のいずれかを検索します。これは間違いなく改善される可能性があります。

幸いなことに、開いているドキュメントを検索するだけで済みます。これは数百ありますが、さらに悪い結果になる可能性があります。これが将来誰かに役立つことを願っています、これは恐ろしいです!

于 2012-04-11T13:39:34.733 に答える