私は ClearCase を 20 年間使用してきましたが、これはクレイジーな問題です。8 年前に別のコンパイラでこの問題に遭遇しましたが、今回は回避策がありません。
FileA には HeaderX と HeaderY が含まれていますが、プリコンパイラは HeaderX とは関係のない HeaderY を読み取ることはありません (式から HeaderX を削除するか、HeaderX に比較的恣意的な変更を加えて、HeaderY を読み取ります)。
ランダムに、古い powerpc-wrs-vxworks gcc-2.96 コンパイラがプリコンパイル中にファイルをインクルードしていないことがわかります。これは、特定の VOB でのみ発生し、動的ビューでのみ発生し、ランダムに発生します。これはこの特定の VOB に固有のものであり、VOB に何か問題があると考えています。この問題は、Win7 ClearCase バージョン 7.1.2.1 で発生しましたが、WinXP でも発生しました。何年にもわたって、別のコンパイラでこの VOB に同様の問題があることに気付きました。コンパイラをトレースすると、コンパイラが開き、インクルード ファイルが fstat され、読み取りなしで閉じられることがわかります。通常、コンパイラはオープン後に読み取りを実行します。トレースは、有効なサイズを返す fstat を示しています。以下は問題の最も単純な要約ですが、動作の説明のためにファイルの内容に関するものだと思い込まないでください。ファイルに任意の変更を加えて、正しい動作を引き出すことができます。具体的には、同じビュー内またはビュー外の別の場所に移動された同一のファイルを使用できます。コンパイラは正しく動作するか、同じファイルで別のビューを使用して動作します。この VOB に固有の MVFS との相互作用と、コンパイラが問題であると考えています。
誤動作している VOB が、ビューでランダムにこの誤動作を示す可能性がある状態に陥る可能性がある状態を見た人はいますか?
foo.c:
#include "HeaderX.h" /* fix 1 remove this line
fix 2 rename this include file
fix 3 move this include file to a new dir */
#include "HeaderY.h" /* fix 4 move this line up
fix 5 rename this include file
fix 6 move this include file to a new dir */
HeaderX.h:
/* a=b; fix 7 uncomment this line */
#ifndef X /* fix 8 change this to an #ifdef instead of #ifndif */
#define X /* fix 9 remove this line
fix 10 change just this X to Y
fix 11 move define after endif */
#endif
HeaderY.h:
#error hurrah! I was included /* GOAL -- to have this file included
If it is included the precompiler
will print this message.
*/
PS コンパイラのバグだとは言わないでください。
ClearCase の問題であると考える理由:
- 動的ビューでのみ発生
- 複数のマシン、複数のユーザー、複数のビュー、異なるオペレーティング システムで発生します。しかし、それはややランダムです。
私の理由を疑う理由:
- 7、8、9、10、11 を修正
- 失敗した場合、別のバージョンのコンパイラを使用してもエラーは発生しません。
- しかし、コンパイラに疑問を呈するのは危険だと思います。同じファイル セットを持つ同じコンパイラは、ClearCase の外部または同じビューの別のディレクトリで正常に動作します。VOBは15年くらい前のもので、VOB特有のものだと思います。しかし、それを交換するのは大変な労力です。