9

現在、VisualStudio2005からVisualStudio2010への移行(アンマネージC / C ++を使用)で忙しいです。つまり、開発者の約半数はすでにVisual Studio 2010を使用しており、残りの半数はまだVisual Studio 2005を使用しています。最近、Visual Studio 2010で特定の構造をクリーンな方法で記述できる状況になりましたが、 VisualStudio2005ではクリーン度の低いソースコードが必要です。すべての開発者が既にVisualStudio2010をマシンにインストールしているわけではないため、次のようなコードを作成する必要があります。

#if _MSC_VER >= 1600
   // clean version of the source code
#else
   // less clean version
   // of the source code
   // requiring multiple lines of code
   // and requiring some dirty static_casts
#endif

すべての開発者は今年の終わりまでにVisualStudio2010に移行するため、このコードは一定の時間が経過すると自動的に「消える」ようにします。ソースコードに「クリーン度の低いバージョン」を保持すると、長期的にはソースコードが読み取れなくなります。

もちろん、コードが自動的に消えないことは知っているので、実際には、しばらくすると自動アラームベルが必要になります。このようなもの:

#if _MSC_VER >= 1600
   // clean version of the source code
#else
   // less clean version
   // of the source code
   // requiring multiple lines of code
   // and requiring some dirty static_casts
#endif
#if compilation_date is after 1 november 2010
#   error "Remove Visual Studio 2005 compatibility code from this file"
#endif

そうすれば、これを忘れた場合、2010年11月1日以降に自動的に通知されます。

このトリックではおそらくDATEを使用する必要がありますが、これはプリコンパイラで処理する必要があるため、文字列操作を実行したり、Cの日付/時刻関数を使用したりすることはできません。

遅延メールを送信するという別のアイデアも検討しましたが、ソースコードに組み込むことができるソリューションがないかどうか疑問に思いました。

4

4 に答える 4

15

GNUの場合、make私は次のようにします。

CFLAGS + = -DCURDATE = $(シェル日付+%Y%m%d)

YYYYMMDD形式の現在時刻を含むマクロCURDATEをコンパイラフラグに追加します。

したがって、ソースでは、次のようなことを行うことができます。

#if CURDATE > 20101101
#error "Do whatever you have to do"
#endif

VSでこのようなことをすることができますか?

于 2010-09-01T07:47:29.940 に答える
6

個人的には、誰もが実際に予定日までに移住することを信じないことにします。それが起こると確信していても、私が間違っている場合に備えて、誰かのために余分な仕事を作成したり、仕事をやめたりしたくはありません。

他に何もないとしても、ビルドは再現可能でなければなりません。12月に、10月のビルドを再現する必要があることに気付いた場合はどうなりますか?それ以上コンパイルされないので、(少なくとも、ビルドマシンの時計を動かさずに)できません。

だから、私はこれをします:

support2005.h
-------------

// empty file

source file
-----------

#include "support2005.h"
#if _MSC_VER >= 1600
   // clean version of the source code
#else
   // less clean version
   // of the source code
   // requiring multiple lines of code
   // and requiring some dirty static_casts
#endif

全員がVS2010を入手したら、support2005.hをに変更します#error "Remove Visual Studio 2005 compatibility code from this file"

実際、私は個人的にその変更を確認しません。これは、VS2005のサポートが削除されるまで誰も作業を行えなくなるためです。デッドコードを削除することは、あなたの会社が11月1日の朝に行う可能性のある最も優先度の高いタスクですか?そして、それを行うには、すべてのハンズオンデッキが必要ですか?むしろ、チェックアウトしてファイルを削除し、完全なビルドを実行し、すべてが再度ビルドされるまで互換性コードを削除し続け、「VS2005サポートを削除する」としてすべてをチェックインします。

忘れてしまうのではないかと心配しているとおっしゃっていますが、もしそうなら、どうしますか?デッドコードは誰も傷つけていません。次回これらのファイルを見るとき、または次にファイルリストやヘッダー依存関係グラフなどに「support2005.h」が表示されるときに覚えておくことができます。したがって、「ソースコードを長期間読めなくする」わけではありません。 "、それを見る長期的な人は誰でもそれを無視するか削除することができるからです。何らかの問題追跡ソフトウェアをお持ちの場合は、2010年11月1日以降に対象となる最初のマイルストーンを見つけて、「VS 2005サポートを削除し、support2005.hを削除する」というタスクをメモとともに添付できます。これは現在、VS2005をまだ使用している開発者によってブロックされています。

2010-11-01を厳しい期限にしたい場合は、コードが壊れてから、ハロウィーンの深夜まで起きて、そのときの変更を確認してください。あなたが要求したように、それは実際にはコードを壊しませんが、ソース管理から更新する人を壊します、そしてそれ故におそらくそれはビルドを壊します。最も重要なことは、誰かが仕事をするのを止めたことが判明した場合、それは非常に簡単に元に戻すことができるか、ローカルで抑制できることです。

于 2010-09-01T11:25:35.090 に答える
2

のようなプリプロセッサ定義を使用します#ifdef WARN_OLD_COMPAT。遅延メールを使用すると、これを定義することを覚えています。

他の方法では、コンパイル日が<X>より後かどうかを確認することはできません。

于 2010-09-01T07:11:12.843 に答える
1

開発ビルドで実行時にチェックを実行しないのはなぜですか?確かにあなたはあなたのコードをテストするので、誰かが日付の後にそれを最初にテストするとき、あなたは通知を受け取ります。

于 2010-09-01T07:14:10.017 に答える