Share via


今日のワンポイント : Visual C++ 2.0 に関する多くのワンポイント - #162

今日はうるう年 (leap year) の 2 月 29 日なので、Visual C++ 2.0 の時代に飛んで (leap) みましょう。

 

ワンポイント シリーズ用にワンポイントの収集を開始したとき、Rico (英語) と私はオフィスで隣り合っていました。あるとき、彼は、自分の Visual C++ 2.0 のワンポイントの一覧を私に渡してくれました。もちろん、VC++ 2.0 を使ったことがなかった私は、その一覧を机の上に放置したため、すぐに埋もれてしまいました。Rico は、私が一覧を読んでいないことを知っていたので、長い間、このワンポイントの一覧を私が読んだかどうかをたずねることをジョークにしていました。"今、お答えします、Rico。私はついにワンポイントを全部読んだわ!"

 

そうそう、Rob Caron。私は、毎日新しいワンポイントを書くためにサインアップする際、今年がうるう年であることに気付いていなかったので、そのことをワンポイントとして数えることにしたわ。

 

Visual C++ 2.0 でのデバッグに役立つヒントby Rico Mariani (作成者の許可を得て投稿しています)

 

これは、Visual C++ に関して私が特に役立つと感じたことを一覧にしたものです。この一覧は Visual C++ 2.0 を対象としていますが、一部のワンポイントは以前のバージョンにも適用されます。 ここに示したワンポイントの中に、皆さんの生産性向上に役立つものがあることを願っています。 私は、このような情報はすべて何かに記載されていると思いますが、Visual C++ 2.0 はとても複雑な製品なので、情報を見つけることができない方がいらっしゃっても不思議ではありません。 特定の順序で記載していないことをご了承ください。

 

ワンポイント #1 : "ツール バーの編集項目は本当に役立つ"

 

便利な機能は、すべてここから実行できます。 事実、現在の単語や選択範囲に対して作用するほとんどのコマンドも、ここから実行します。 たとえば、API 名に関するオンライン ヘルプを表示するには、Ctrl + F キー (PWB 変換の場合は Alt + A キー) を押してそこにフォーカスを移動し (または、その上でクリックし)、対象となる API 名を入力してから、F1 キーを押します。 これだけではありません。F11 または Shift + F11 キーを押して、それぞれシンボルの定義または参照に移動したり、適切なキーを押して任意のブラウザクエリを使用したりできます。また、F9 キーを押してブレークポイントを設定することもできます。 さらに、式の値をすばやく確認するためのクイック ウォッチ (Shift + F9) もあります (これは、デバッグ中でなくても動作するため、高速な計算機として使用できます)。 このフィールドの本来の機能は検索の実行ですので、F3 キー (検索) ももちろん機能します。 編集フィールドは、小さなコマンド ウィンドウのようなものです。

 

ワンポイント #2 : "最も適切な場所に入力できる"

 

完全に編集可能であるのに、あまり明らかにされていない項目がいくつかあります。たとえば、ウォッチ ウィンドウでは、ローカル ウィンドウと同様に、変数の値を事後に編集できます。 メモリ ウィンドウでは、アドレス フィールドに入力して新しい表示場所を設定したり (このことを既に知っている場合は、ツール バーをオフにすると、少し領域を回復できます)、表示領域に入力して、表示されるバイト/単語数などを編集したりできます。 これらのウィンドウは、すべて完全に機能するテキスト ウィンドウなので、内容をクリップボードにコピーし、予備のドキュメントに貼り付けておくと、後で比較したり友人に送付したりできます。 これは、呼び出し履歴や逆アセンブルについても同じです。

 

ワンポイント #3 : "呼び出し履歴ウィンドウでは、追加の機能を実行できる"

 

呼び出し履歴は、表示するためだけのものではありません。F9 キーを使用して戻る場所にブレークポイントを設定したり (チェックポイントのセーフティ ネットを設定するのに最適です)、F7 キーを使用して特定のフレームに戻るまで実行したりできます。コピー アンド ペーストを使用して、これらの呼び出し履歴を必要としている開発者に送信することもできます。

 

呼び出し履歴を生成すると、コンピュータに大きな負荷がかかるため、必要なときだけウィンドウを開くようにするか、少数のフレームだけが計算されるようにウィンドウを小さなサイズで保持します。そうしないと、ステップの速度が著しく低下します。 ローカル ウィンドウの小さな呼び出し履歴ドロップダウンには、呼び出し履歴ウィンドウほど多くの項目が表示されませんが、負荷や占有領域が小さく、コード ビューに表示された古い呼び出し履歴メニューと同じように簡単にフレームを変更できます。これで間に合う場合は重宝です。

 

ワンポイント #4 : "デバッガでもドラッグ アンド ドロップを使用できる"

 

ドラッグ アンド ドロップを使用すると、入力の手間をかなり省くことができます。 ソース ウィンドウからウォッチ ウィンドウにドラッグすると、ウォッチが追加されます。 メモリ内の変数の値を表示するには、ウォッチ ウィンドウからドラッグします。 ポインタが指しているアドレスをドラッグすると、メモリの内容が表示されます。 関数名を逆アセンブル ウィンドウにドラッグすると、そのコードが表示されます。 メモ : ポインタが指している内容を確認するために、メモリ ウィンドウにポインタ変数をドラッグした結果、混乱することがよくあります。これは、Visual C++ では、ポインタが指している内容ではなく、ポインタ変数そのものが表示されるためです。この問題を回避するには、ポインタ変数ではなく、ポインタの値をドラッグします。

 

ワンポイント #5 : "クイックウォッチは、すばやくウォッチするためだけのものではない"

 

クイックウォッチはモーダル ダイアログなので、ウォッチ ウィンドウでは動作しない 2 つの便利な機能を実行できます。

 

· 関数呼び出しを含む式を評価できます。 これは、アプリケーションのデバッグに役立つすばらしい方法です。OutputDebugString() を使用するいくつかのダンプ関数を記述することによってプログラムの状態情報を生成してから、それらの関数をデバッガから呼び出します。

 

· C++ クラスへのポインタを参照している場合、デバッガによってクラスの実際の型が自動的に示されます。 たとえば、CWnd* を使用し、その CWnd が実際には CListBox (CWnd から派生したクラス) である場合は、CListBox のメンバを表示するために展開できる追加の項目によってウィンドウ内に示されます。 多くの場合、クラスの実際の型は、データ メンバよりも重要です (CWnd は典型的な例です。ウィンドウの種類を知ることは、たとえば m_hWnd の値を知ることよりも有用です)。

 

クイックウォッチの既定のアクセラレータは、Shift + F9 です。この小さな編集項目に式を入力してウォッチできることを忘れないでください。 私が最も頻繁にクイックウォッチするものは "this" ですので、最派生型を確認できます。

 

ワンポイント #6 : "再度実行するかどうかを判断する"

 

プログラマが陥りやすい典型的な問題は、1 つのステートメントにステップを設定しすぎることです (通常、これは関数呼び出しを通じて行われます)。 EIP は、ソース行を右クリックし、ポップアップ メニューから [次のステートメントの設定] を選択する (または、キーボードを使用してソース行にカーソルを移動し、Ctrl + Shift + F7 キーを押す) ことによって、簡単に任意の場所に戻すことができます。 関数呼び出しやループなどが 2 回目に実行されるのを見るだけでなく (初期化ステップを同時に実行すると、1 つのループが何回も実行できます)、右中かっこにカーソルを移動することにより、関数を最後まで実行せずにステップ アウトするようにデバッガを強制できます。 または、エラーを発生させるコードをスキップし、フレームを 1 つまたは 2 つ上に移動して、問題の実際の原因が存在する場所に戻ることができます (そこで呼び出しを繰り返すこともできます)。 現在の関数の外部に EIP を移動しようとすると、望ましくない結果が予想される (スタックが矛盾する可能性がある、デストラクタが実行されないなど) ために警告が通知されますが、これさえも役に立つことがあります。

 

ワンポイント #7 : "リモートはどこにあるか"

 

Visual C++ 2.0 では、リモート デバッグが使いやすくなりました。正しく構成するために、高度な知識は必要ありません。事実、とても簡単に使用できます。 現在は、Intel プラットフォーム上でのシリアル通信だけがサポートされています (ネットワーク サポートを要求するフィードバックをお送りいただいた皆さん、ありがとうございました。メッセージを拝見しました)。57600 ボーでもローカルほど高速ではありませんが。

 

次の 2 つは、パフォーマンスを向上するための重要なヒントです。

 

· 38400 ボーをお試しください。 これは冗談ではありません。 ケーブルの長さとコンピュータの速さ (そして、おそらく金星と木星の位置関係) によっては、57600 ボーでは余計な通信エラーが多数発生する可能性があるため、実質的には 38400 ボーの方が速くなります。

 

· 呼び出し履歴ウィンドウは、必要のないときは閉じておきます。 たくさんのウォッチや巨大なメモリ ウィンドウを表示すると大量のデータが送信されることはだれでもわかりますが、呼び出し履歴ウィンドウは非常に小さく、問題ないように見えます。 しかし、適切な呼び出し履歴を収集するためには、デバッガは、あらゆる種類のメモリとリモート デバッグ中に送信されるすべてのものを漏れなく調べる必要があります。

 

デバッガとデバッグ対象が同じキーボードとモニタを共有することで問題のあるシナリオが作成されないようにする場合、リモート デバッグは、問題を回避できるすばらしい手段になります。 また、リモート デバッグを使用することにより、IDE 全体が適合しない可能性があるシステム (たとえば、4 M のインストールでのみ問題が再現される場合) でデバッガを取得できるようになります。

 

ワンポイント #8 : "ブラウザツール バーがあることを忘れない"

 

ブラウザを使用している場合 (または、これまで使用せず、これから使用しようと思っている場合) は、ブラウザ ツール バーをオンにします。 これは、ブラウザ クエリにアクセスするための最良の方法です。 各ボタンのツール ヒントをチェックして (ボタンの上にカーソルを移動するだけです)、すべてのボタンの機能を確認します。次に、参照する対象をクリックし、適切なボタンをクリックします。 ツール バーの編集項目から参照できることを忘れないでください。 そこにワイルドカードを入力してから、ブラウザ クエリを実行します。私の一番のお気に入りは、"*.cpp" に対してファイルのアウトラインを実行することです。 次に好きなのは、"CMyClass::On*" に対して [定義へ移動] を実行して、クラスに定義したすべてのメッセージ ハンドラを表示することです。

 

さて、私はこの一覧を、だれも読まないような大きなドキュメントにしたくないので、このワンポイントはこれで終わります。

 

ワンポイント #9 : "宝探しをする"

 

さまざまな考えが基になって、IDE は、いろいろな機能を容易に見つけることができる生産的な場所になりました。しかし、最新の開発環境には、大きなアプリケーションに匹敵するほどの豊富な機能が用意されています。これらをすべてメイン メニューに含めることは不可能です。 少し時間をかけて、ポップアップ メニューやツール バーを調べ、さまざまなオプション ページやプロパティ ページを表示してみてください。 何かうれしい驚きがあるはずです。 私はそう確信しています。

 

プロジェクト、エディタ、およびリソース

 

以下は、SD '95 で私が行った "Advanced Visual C++" という表題のプレゼンテーションの要約です。 このプレゼンテーションは好評だったようで、このとき使用したスライドが欲しいという要望がさまざまな方々から寄せられました。しかし、これらのスライドは、皆さんの使用にはほとんど適しません。 そこで、私はこのワンポイント集を代わりに作成しました。これには、既に公開済みのデバッガに関する情報を除いて、このプレゼンテーションのすべての内容が含まれています。 これまでのワンポイントと同様、この情報は Visual C++ 2.0 を対象としていますが、その多くは v1.0 も適用されます。 ではすぐ本題に入りましょう・・・・・・

 

#1. 外部メイクファイルをラップして機能を追加する

 

Visual C++ のプロジェクト機能は非常に一般的であるため、この機能により、ビルドを実行する任意のコマンドを使用できます (作業を実行するのは、nmake であるとは限りません)。 プロジェクトのビルドがどんなに複雑でも、ビルドを実行する外部メイクファイルを作成できます。 これには、多くの利点があります。たとえば、出力ウィンドウに出力が取り込まれるため、F4/Shift + F4 キーを使用してエラーを順に確認できる、デバッガはデバッグ時に実行する必要がある .exe を認識する、ブラウザは使用するブラウザ データベースを認識する、などです。 最後に、Visual C++ の設定の多くはプロジェクトごとに記憶されるため、ラップすることによってプロジェクトのカスタム オプションを使用できます。 実際に外部メイクファイルを作成するには、ビルドを実行する主要ファイル (通常は、メイクファイル) に対して File.Open コマンドを使用し、右下の一覧で [Open As Makefile] を選択します。

 

#2. 一度に複数のファイルのコンパイル フラグを変更する

 

プロジェクト システム内で最も使用されている機能の 1 つに、プロジェクト設定ダイアログのツリー コントロールにおける複数選択があります。 複数のファイルを選択することにより、共通するフラグを確認したり、フラグを一度に変更したりできます。 これは、グループ間、またはターゲット間でも機能します。ツリー内のグループ ノードやターゲット ノードを選択することは、そのグループやターゲット内のすべてのファイルを選択することと同じです。 これは、ターゲット間でどのフラグが変更されているかを正確に確認する場合にうってつけの方法です。

 

#3. プロジェクト システムのユーザー インターフェイスに隠し機能がある

 

プロジェクト システムは、単にビルドを実行するだけのものではありません。 リソース ファイルをダブルクリックして適切なリソースエディタを開いたり、ファイル マネージャからファイルをドラッグ アンド ドロップしてプロジェクトに追加したりできます。また、ソース以外の任意のファイルをプロジェクトに追加したり、プロジェクトシステムを使用して関連するアプリケーションを起動したりすることもできます。 これは、デザイン ドキュメントを更新する場合に非常に便利です (もちろん、デザイン ドキュメントはお持ちですよね =))。

 

#4. テキスト エディタが大幅に改善されている

 

評判の悪かった Visual C++ テキスト エディタが大幅に改善されました。 以下は、Visual C++ エディタで実現できるとは考えられなかった機能のトップ 10 です。

 

10. Ctrl + Alt + T キーを押すと、タブ文字が表示される。

 

9. Shift + Esc キーを押すと、アクティブなドッキング可能ウィンドウ (出力、ウォッチ、ローカルなど) が閉じる。

 

8. Ctrl + F3 キーを押すと、現在の単語が次に現れる箇所が検索される。

 

7. Ctrl + M キーを押すと、対応するかっこが検索される。

 

6. Ctrl + > キー/Ctrl + < キーを押すと、次の/前の #ifdef、#else、または #endif が検索される。

 

5. Ctrl + Shift + R キーを押すと、マクロの記録が開始/停止される。

 

4. Ctrl + Shift + P キーを押すと、記録されたマクロが再生される。

 

3. #include 行を右クリックすると、インクルード ファイルが開く。

 

2. Tab/Shift + Tab キーを押すと、選択した行にインデントが設定/設定解除される (行全体を選択している場合)。

 

1. Alt キーを押しながらドラッグすると、列が選択される

 

#5. リソースは状況に応じて異なる

 

"魔法の" 代替 ID を使用することにより、リソースを条件付きでコンパイルできます。 たとえば、あるバージョンの Foo ダイアログをデバッグ用に、別のバージョンの Foo ダイアログをその他のビルド用に使用するには、IDD_FOO と IDD_FOO$(DEBUG) に対応するリソースを作成します。 リソース エディタは、この手法を使用して Macintosh 固有のバージョンのダイアログなどをクロスプラットフォーム バージョンの製品で提供します。ただし、これは、必要に応じていつでも行うことができます。

 

#6. クラス ウィザードは、Ctrl キー + ダブルクリックで起動できる

 

ダイアログ コントロールに対する通常のクラス ウィザード操作は、Ctrl キーを押しながらダブルクリックするだけで実行できます。 コントロールがボタンである場合は、クリック ハンドラが追加され、コードを入力できるようになります。それ以外の場合は、適切なメンバ変数を追加するように求められます。 これは、データ テーブルのフィールドにコントロールをバインドする必要があるデータ認識コントロールで特に役立ちます。

 

#7. ビットマップ エディタのキーボード インターフェイスは終了しない

 

編集機能のほとんどは、いずれかのキーに割り当てられています (マニュアルには便利な表が用意されています。実際に、よく利用すると考えられるほとんどの機能についてのキーボード マップ表が付属します)。 非常に興味深いのは、いくつかのキーはドラッグ操作中に最もよく使用されることです。 たとえば、ある点から別の点に線を描こうとしている場合、開始点を詳細に表示するために拡大表示すると、ドラッグ中にズーム モードから抜け出せなくなるのでしょうか。 いいえ。ドラッグ中に M キー (M は "拡大" を表します) を押して拡大を解除し、終点の近くに移動してから、もう一度 M キーを押して正確に配置できます。 Ctrl + B キーも私のお気に入りの 1 つです。これを使用すると、現在の選択対象をブラシに変更して描画できます。これには便利な用途がたくさんありますが、3D の彫り込み線のコピーの作成もその 1 つです。これを使用しない場合、彫り込み線を何度も描画する必要があるため、とても手間がかかります。 このエディタを使用する場合は、キー バインドを確認してください。その便利さがおわかりいただけるでしょう。

 

投稿 : 2008 年 2 月 29 日 (金) 3:00 AM saraford

Sara Ford さんの Web ログ - https://blogs.msdn.com/saraford/archive/2008/02/29/did-you-know-a-lot-of-tips-go-back-to-visual-c-2-0-162.aspx  より。