Visual Studio メモ†
ビルド後イベントで実行ファイルをコピー†
ビルド後に実行ファイル(*.exe)を特定のフォルダにコピーしたいなどの場合は,
ビルド後イベントを設定する.
プロジェクトのプロパティ → 構成プロパティ → ビルド イベント → ビルド後イベント
と開き,「コマンド ライン」のところにビルド後に実行するコマンドを記述する.
例えば,ビルド後に実行ファイルをbinフォルダにコピーしたい場合は,
copy /Y /V "$(OutDir)$(TargetFileName)" bin\
とする.パスにスペースなどが含まれる場合はダブルクォーテーション(")は必須.
$(OutDir),$(TargetFileName)はVisual Studio内での環境変数である.
これらの環境変数は,「コマンド ライン」欄を選択し,右端のドロップメニューから編集を選び,
出てきたウィンドウの「マクロ」ボタンで確認することができる.
(*.dllファイルのコピーの場合はxcopyを使う).
nmakeを使うには†
Visual StudioにはMakefileでのコンパイルに対応したnmake.exeが同梱されている.
Visual Studio 2010の場合,
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\nmake.exe
にある.
これを通常のコマンドプロンプトから実行するためには,
Visual Studio環境変数を整える必要がある.
このためのバッチファイル vcvarsall.bat が用意されているので,
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
とコマンドプロンプトで実行するとnmake.exeが使えるようになる.
なお,64bitアプリケーションのビルドがしたい場合は,
nmakeのターゲットプラットフォームをamd64にしなければならない.
その場合は,vcvarsall.batに引数amd64を与えればよい.
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64
その他のプラットフォームについては,
MSDNの64 ビットの Visual C++ ツールセットをコマンド ラインから有効にするが参考になる.
VS2012とVS2013の違い†
主に開発時に役立ちそうなちょっとした改良点,C++に関連したもの(参考ページ)
- Windows8.1ストアアプリ対応(VS2012だとWindows8対応のものしか作成できない)
- ISO C/C++標準のサポートの強化(個人的に便利そうだと思ったのだけ以下にあげる)
- 波括弧による初期化(統一初期化記法への対応) : クラスの変数などを初期化するときにx(1)というように丸括弧だっけ出なく,x{1}のように波括弧も使えるようになった.Cの配列初期化と統一的に扱えるようになった.vectorあたりで使うと便利そう.
std::vector<int> x{1, 2, 3, 4}
参考 : http://faithandbrave.hateblo.jp/entry/20111221/1324394299
- コンストラクタのデリゲート : コンストラクタから同クラス内の別のコンストラクタを":"で呼び出すこと(デリゲート)が可能になる.共通処理を重複して記述する手間軽減によい.
class A{
A(){ /* 共通処理 */ }
A(int x) : A() { /* A(int x)だけの処理 */ }
};
- 未加工(ナロー)文字列リテラル : 文字列を定義する文字列リテラル("test"やワイド文字用のL"test")で改行文字や二重引用符をそのまま含んで定義できるもの.通常の文字列リテラルだと"\n"や"\""としないといけないところを以下のように直接定義できる.
const char *s = R"charactor \ test";
const wchar_t *ws = LR"charactor " test";
参考 : https://msdn.microsoft.com/ja-jp/library/69ze775t.aspx
- 可変個引数テンプレート : 省略記号(...)を使って可変個の引数を持つテンプレートが作成可能になる.
template<typename ... T> class Test;
クラスの変数を定義するときは以下のようにする.
Test< > a;
Test<int> b;
Test<double, int> c;
参考 : https://msdn.microsoft.com/ja-jp/library/dn439779.aspx
- エイリアステンプレート : typedefと同様に型名を新しく定義する方法としてエイリアスというのがある.
using Type = int; // typedef int Type と同じ
このエイリアスはtypedefと違ってテンプレートが使える.
例えば,
template<typename T> using Ptr = T*;
Ptr<int> x; // int型のポインタ
参考:https://msdn.microsoft.com/ja-jp/library/dn467695.aspx
- パフォーマンス関係
- リンカー最適化のためのリンカーオプション(/Gw, /Gy : コンパイラとアセンブラ)の追加
- C++AMPの共有メモリのサポート (CPU-GPU間のデータコピーの減少)
- 自動ベクター化による最適化,ARM,Atomアーキテクチャのコード品質の向上,などなど
- IDE関連
- 中括弧({,(,[,',")の自動補完
- C++オートコンプリートの追加(クラス定義のセミコロン(;),未加工リテラルの括弧,複数行コメント(/* */)
- アクセス不可能なクラスメンバをIntelliSenseのメンバ一覧から除外
- ショートカットキーによるヘッダ/コードファイル間の切り替え
- ビルド時間の効率化
- Gitに標準対応(VS2012では拡張機能で対応)
- スクロールバーにコード全体を縮小表示するマップモードを追加
VS2010とVS2012の違い†
主に開発時に役立ちそうなちょっとした改良点,C++に関連したもの.
- Windowsストア・アプリ関連のプロジェクトテンプレートの追加(C#/VB向けに6つ,C++向けに9つ)
- グラフィックス関連のプロジェクトテンプレートにBitmapだけでなくGIF,JPEG,PNG,TIFF,3Dシーン(FBX),視覚シェーダグラフ(dgsl)などの追加
- 画像ファイルはImage Editor, FBXはModel Edtitor, dgslファイルはShader DesignerによりVS上から編集可能
- ツールボックス,プロパティウィンドウ,ソリューションエクスプローラなどでの検索機能の追加
- クイック検索,クイック置換機能の追加
- Ctrl+Fでの検索とCtrl+Hでの置換処理で検索/置換ウィンドウを出すのではなく,エディタの右上に小さな検索窓が出るようになった
- 通常の検索/置換ウィンドウはCtrl+Shift+F,Ctrl+Shift+H
- VS2010の拡張"Productivity Power Tools"に含まれていたQuick Findと同じ機能
- 検索時の正規表現機能がさらに充実した
- ソリューションエクスプローラに機能追加
- 選択項目のプレビュー : クリックでプレビュー,プレビュータブのボタンを押すとコードエディタで表示
- ファイル内の型とメンバの表示 : クラスビューと同じような機能
- 特定の項目に絞った表示 : 項目を右クリックして"ここまで検索"
- 複数のソリューションエクスプローラの表示 : 項目を右クリックして"新しいソリューションエクスプローラのビュー".上記の特定項目表示と組み合わせたり,マルチモニタ環境で用いたり
- マクロ機能の削除
- C++関連
VS2008とVS2010の違い†
ここでは主に開発時に役立つちょっとした改良点,変更点をあげる.
- IntelliSenseでのあいまい検索 : これまでメンバ変数などの候補は前方一致検索の結果のみリスト化されていたが,部分一致や後方一致の結果も表示するようになった.
- IntelliTrace : デバッグ時にある時点での変数の状態や呼び出し履歴などを保存しておける機能.IntelliTraceウィンドウ上で保存されたイベントの一覧を選ぶだけでそのときの変数や呼び出し履歴の状態を確認できる.
- 複数プロジェクトの同時起動 : デバッグ時に複数のプロジェクトのアプリケーションを同時起動できる.ソリューションの共通プロパティのスタートアッププロジェクトからアクションとして,開始やデバッグなしで開始を複数のプロジェクトに対して設定することができるようになっている.
- マルチモニタ対応 : エディタ,デザイナ,ツール・ウィンドウをウィンドウ外に移動できる.エディタを別窓にできるのはよいかもしれない.
- Navigate To : 型,ファイル,変数,メンバの検索.「Ctrl+,」で呼び出せるNavigate Toウィンドウから検索できる.
- 呼び出し階層の表示 : 関数などの呼び出しをツリー化して表示する機能.
- ハイライト表示 : エディタ内で変数などをハイライト表示すると,後続の同じ名前の変数も自動的にハイライト化される.
- ブレークポイントラベル : ブレークポイントにラベルを付けることでグループ管理することができる.ラベルごとのブレークポイントのON/OFFなどが可能に.
- ブレークポイントのインポート/エクスポート : ブレークポイントをXMLファイルにエクスポート or からインポートすることができる.
- DataTipsのピン留め : デバッグ時に変数にポインタを合わせたときに出るDataTipsにピンが追加され,ピン留めすることで常に表示することが可能になった.ピン留めされたDataTipsのインポート/エクスポートも可能.
- 矩形選択の改良 : これまでもAltキーを押しながらマウスでテキストを選択することで矩形選択が可能であったが,VS2010からはさらに,貼り付け機能の強化や幅が0の矩形を選択して,選択行にまとめて同じ文字列を挿入できる機能などが追加されている.
参考動画 - Box Selection and Multi-Line Editing Demo
- エディタのズームイン/アウト : FireFoxなどのブラウザと同様に[Ctrl+ホイールスクロール]でエディタ画面のズームイン/アウトが可能.ホイール以外にもエディタウィンドウの左下にあるパーセンテージを変更することでもズームできる.
- Windows7タスクバーのジャンプリストへの対応
- アドインを探せるVisual Studio Galleryの追加(アドインの例:Visual Studio Power Tools).
- VS2010で作成したバイナリはWindows2000以前では動作しないようになった(VS2008では98/NT4/Me以前,VS2005では95以前).
- ソースコード単位での並列コンパイルができるようになった(VS2008以前はプロジェクト単位).プロジェクトのプロパティでC/C++→全般の"複数プロセッサによるコンパイル"を"はい"にすると有効になる.クアッドコアなどのCPUを使うとコンパイルが数倍早くなることも.ただし,デバッグモードだと/GmオプションがデフォルトでONになっていて,並列コンパイルが使えない.その場合は,C/C++→コード生成の"最小リビルドを有効にする"を"いいえ (/Gm-)"にする.
リンク
個人的に引っかかったところ
Microsoft Visual Studio Version Selectorの実体†
slnファイルの関連付けに用いられている"Microsoft Visual Studio Version Selector"の実体は以下にあります.
C:\Program Files\Common Files\microsoft shared\MSEnv\VSLauncher.exe
x64の場合は,
C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\VSLauncher.exe
ショートカットキー†
- キーワード検索 [CTRL]-[F3]
- ナビゲーション [CTRL]-[-]
- インクリメンタル [CTRL]-[I]
- ブックマーク登録 [CTRL]-[K]+[K]
- 次 [CTRL]-[K]+[N]
- 前 [CTRL]-[K]+[P]
- 消去 [CTRL]-[K]+[L]
- クリップボード履歴 [CTRL]-[SHIFT]-[V]
- コメントトークン // TODO:
- // HACK:
- // UNDONE:
warning C4819 について†
warning C4819 : ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
「/*」の後に「+」とか「|」とかの文字が隣接してると駄目っぽい.例えば「/*|」->「/* |」にすれば警告は止まる.
「|*」でも駄目っぽい.「| *」ならOK?
warning LNK4221 について†
warning LNK4221: パブリック シンボルが見つかりませんでした。アーカイブ メンバにアクセスできません。
aaa.h
aaa.cpp
でaaa.cppの中身が
#include "aaa.h"
だけのときにでる?
スタティック ライブラリにリソースを追加するとき、「 LNK4221」メッセージ警告リンカ ツールを表示します。
warning LNK4006 について†
スタティックライブラリを作成するプロジェクトにスタティックライブラリ(*.lib)を追加の依存ファイルとして指定していた場合に出る.例えば,a.libというライブラリをb.libというライブラリを作成するプロジェクトBから呼んでいて,b.libはc.dll or c.exeを生成するプロジェクトCから呼ぶという構造の場合,a.libはプロジェクトCのみから呼ぶようにして,プロジェクトBからは呼ばない要にする.つまり,最終的なdll,exeのプロジェクトのみからすべてのスタティックライブラリを呼ぶようにする.
上記の例ではプロジェクトBのビルド時にリンクエラーが出そうだが,実際には出ない.また,この警告はVC6以前では出なかったらしい.
pragma†
- warningの抑制
#pragma warning (disable: 4996)
- ライブラリのリンク
#pragma comment(lib, "glut32.lib")
- リンカオプション指定
#pragma comment(linker, "/option:value")
- インクルードガード
#pragma once
- 構造体のパッキング(アライメント)の設定
#pragma pack(push, N)
...
#pragma pack(pop)
- メッセージ表示
#pragma message("message")
VS2005とVS2008の違い†
タスク一覧とブックマーク†
「表示→タスク一覧」 でタスク一覧ウィンドウがでる.
ウィンドウ上部が「ユーザータスク」となっていたら「コメント」に変える.
コード上のコメントで,
// HACK:ここを変更
などのように記述すれば行番号とともに一覧表示される.
ダブルクリックすればその場所に移動する.コードが長くなってきたら便利.
また,「ツール→オプション」のオプションウィンドウで,「環境→タスク一覧」でオリジナルのキーワード(トークン)を追加できる.
コード定義ウィンドウ†
「表示→コード定義ウィンドウ」でコード定義ウィンドウが表示される.
コード中の関数呼び出し部などをクリックするとその実装の中身などがすぐに見られる.
正規表現検索†
Ctrl-Fの検索ウィンドウやCtrl-Rの検索と置換ウィンドウでは文字列検索を行えるが,ウィンドウ一番下の条件チェックをオンにして「正規表現」を選ぶと正規表現による検索,置換ができる.
例えば,/* */ の一行コメントを // に置き換える場合,
検索する文字列に
/\* (.*) \*/
置換後の文字列に
// $1
とすればよい.
ちなみに上記の例はVisual Studio 2012以降で,それ以前のVisual Studioの場合は,
検索側
/\* {.*} \*/
置換後
// \1
であった.
そのほか,Visual Studio独自の表現として以下のようなものがある.
クリップボードリング†
Visual Studio内蔵のクリップボード履歴機能.貼り付けるときにCtrl+Vでなく,Ctrl+Shift+Vを押し,
CtrlとShiftを押したままVを押し直すと最大過去20個の履歴が次々出てくる.
コード整形†
「編集→詳細→選択範囲のフォーマット」で字下げなどを整えてくれる.
Visual C#ならば,間のスペースなどもっと細かいものをオプションウィンドウで指定できる.
リンク†