ほとんどが C++ で構成され、ほとんどが gcc でビルドされているコード ベースで作業していますが、MSVC でビルドする必要がある場合もあります。Microsoft の C コンパイラは、いくつかのマイナーな拡張機能を備えたほとんどの C89 のままであり、C++/C99 風の混合コードと変数定義をまだサポートしていません。そのため、開発者が gcc で作業しているときに順不同のコード/変数定義を記述しないようにする方法を見つける必要があります。そうしないと、ビルドが後で MSVC で壊れます。私が使用するgcc -std=c89
と、C++ スタイルのコメントが許可されていないため、すべてが壊れます (他の問題もあるかもしれませんが、これ以上調べていません)。使用するgcc -std=gnu89
と、順不同のコード/変数定義が許可されるため、それも役に立ちません。何か案は ?私はちょうどのようなものが必要だと思いますgcc -std=c99 -fno-inline-variable-definitions
、そのようなオプションが存在する場合。
3 に答える
gcc warnings info pageで説明されているように、-Wall
-Wextra
-Wstrict-prototypes
-Wold-style-definition
-Wmissing-prototypes
-Wmissing-declarations
and-Wdeclaration-after-statement
オプションを使用しています。これらは、システム ヘッダー ファイルの問題から多くのノイズを引き起こす可能性があることに注意してください。これらは単なる警告であるため、警告ゼロのビルドを作成することに熱心であるというポリシーが必要です。
あなたが望むことをする方法があるとは思いません。MSVC でサポートされている C の方言は、C99 よりも C89 に近いです (たとえば、指定された初期化子もサポートしていません)。C89-with-C++-comments-and-inline-keyword にもっと似たものが本当に必要です。
これに関する問題は、 C++ コメントが有効な C89 コードの正確さに影響を与える可能性があることです。たとえば、この行の意味は大幅に変わります。
int a = 10//* foo */2;
C89スタイルのコメントを含め、CソースファイルにC89を強制するのが最善の策だと思います。 inline
ただし、おそらく問題ありません。gcc で定義できます__inline
。
コードをコンパイル不能にするのは Win32 ではなく、コンパイラです。Win32 で GCC を使用すると、プラットフォーム間の互換性が向上します。
もう 1 つの可能性は、Win32 ビルドに C++ コンパイルを使用することです。GCC コンパイルは、それが有効な C であると既に判断しており、C++ コンパイルは通常、より強力な C にもします。
[編集] 別の解決策は、 CruiseControlなどの継続的統合サーバーを使用して、GCC プラットフォームのコーダーがコードをチェックインするたびに、CI サーバーがコードをチェックアウトして VC++ を使用してビルドできるように構成することです (または、サードパーティの静的分析を適用することさえできます)。ツール) を使用し、エラーが発生した場合は、エラーのあるコードをチェックインしたユーザーに結果を電子メールで送信します。この解決策は、元の問題には重いかもしれませんが、それ以外にも多くの利点が得られる可能性があります。