*Visual Studio メモ [#j6378e28]

#contents


**ビルド後イベントで実行ファイルをコピー [#k16be925]
ビルド後に実行ファイル(*.exe)を特定のフォルダにコピーしたいなどの場合は,
ビルド後イベントを設定する.
 プロジェクトのプロパティ → 構成プロパティ → ビルド イベント → ビルド後イベント
と開き,「コマンド ライン」のところにビルド後に実行するコマンドを記述する.
例えば,ビルド後に実行ファイルをbinフォルダにコピーしたい場合は,
 copy /Y /V "$(OutDir)$(TargetFileName)" bin\
とする.パスにスペースなどが含まれる場合はダブルクォーテーション(")は必須.
$(OutDir),$(TargetFileName)はVisual Studio内での環境変数である.
これらの環境変数は,「コマンド ライン」欄を選択し,右端のドロップメニューから編集を選び,
出てきたウィンドウの「マクロ」ボタンで確認することができる.
(*.dllファイルのコピーの場合はxcopyを使う).


**nmakeを使うには [#w7befbbb]
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++ ツールセットをコマンド ラインから有効にする:http://msdn.microsoft.com/ja-jp/library/x4d2c09s.aspx]]が参考になる.


**VS2012とVS2013の違い [#ob20539a]
主に開発時に役立ちそうなちょっとした改良点,C++に関連したもの([[参考ページ:https://msdn.microsoft.com/ja-jp/library/hh409293.aspx]])
-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の違い [#zeb8b2db]
主に開発時に役立ちそうなちょっとした改良点,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+":"で検索
-クイック検索,クイック置換機能の追加
--Ctrl+Fでの検索とCtrl+Hでの置換処理で検索/置換ウィンドウを出すのではなく,エディタの右上に小さな検索窓が出るようになった
--通常の検索/置換ウィンドウはCtrl+Shift+F,Ctrl+Shift+H
--VS2010の拡張"[[Productivity Power Tools:http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef/]]"に含まれていたQuick Findと同じ機能
-検索時の正規表現機能がさらに充実した
-ソリューションエクスプローラに機能追加
--選択項目のプレビュー : クリックでプレビュー,プレビュータブのボタンを押すとコードエディタで表示
--ファイル内の型とメンバの表示 : クラスビューと同じような機能
--特定の項目に絞った表示 : 項目を右クリックして"ここまで検索"
--複数のソリューションエクスプローラの表示 : 項目を右クリックして"新しいソリューションエクスプローラのビュー".上記の特定項目表示と組み合わせたり,マルチモニタ環境で用いたり
-マクロ機能の削除
-C++関連
--参照の強調表示 : 1つのインスタンスをポイントするとすべてのインスタンスが強調表示される.Ctrl+Shift+↓/↑で参照間の移動もできる
--メンバ関数の一覧が入力時に自動表示されるように
--[[C++11:http://ja.wikipedia.org/wiki/C%2B%2B11]]への対応強化
---STLヘッダ atomic, chrono, condition_variable, filesystem, future, mutex, ratio, threadのサポート
---[[範囲ベースのforステートメントへの対応:http://msdn.microsoft.com/ja-jp/library/jj203382]] : BOOST_FOREACHみたいなfor分の記述ができる(例, for(auto x: f) )
---スコープ付き列挙型 enum class のサポート
---[[ラムダ関数のサポート:http://msdn.microsoft.com/ja-jp/library/dd293608]]
---コンテナのサイズ縮小 (例,vector : 16byte -> 12byte, map : 16byte -> 8byte)
--複数コア,複数CPUでのコンパイルしたアプリの実行速度の向上([[並列パターンライブラリ PPL:http://msdn.microsoft.com/ja-jp/library/dd492418]])
--GPUを用いたデータ並列アルゴリズムの処理の向上([[C++ Accelerated Massive Parallelism (C++ AMP)ライブラリ:http://msdn.microsoft.com/ja-jp/library/hh265137]])



**VS2008とVS2010の違い [#nb9e1d8f]
ここでは主に開発時に役立つちょっとした改良点,変更点をあげる.

-''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:http://www.youtube.com/watch?v=qp2WuJ2rEE4&feature=player_embedded]]
-''エディタのズームイン/アウト'' : FireFoxなどのブラウザと同様に[Ctrl+ホイールスクロール]でエディタ画面のズームイン/アウトが可能.ホイール以外にもエディタウィンドウの左下にあるパーセンテージを変更することでもズームできる.
-''Windows7タスクバーのジャンプリストへの対応''
-''アドインを探せる[[Visual Studio Gallery:http://visualstudiogallery.msdn.microsoft.com/]]の追加''(アドインの例:[[Visual Studio Power Tools:http://msdn.microsoft.com/en-us/vstudio/bb980963.aspx]]).
-''VS2010で作成したバイナリはWindows2000以前では動作しないようになった''(VS2008では98/NT4/Me以前,VS2005では95以前).
-''ソースコード単位での並列コンパイルができるようになった''(VS2008以前はプロジェクト単位).プロジェクトのプロパティでC/C++→全般の"複数プロセッサによるコンパイル"を"はい"にすると有効になる.クアッドコアなどのCPUを使うとコンパイルが数倍早くなることも.ただし,デバッグモードだと/GmオプションがデフォルトでONになっていて,並列コンパイルが使えない.その場合は,C/C++→コード生成の"最小リビルドを有効にする"を"いいえ (/Gm-)"にする.

リンク
--[[現場開発者から見たVisual Studio 2010 - @IT:http://www.atmarkit.co.jp/fdotnet/chushin/introvs2010_01/introvs2010_01_01.html]]
--[[VS2010&.NET4シリーズ - @IT:http://www.atmarkit.co.jp/fdotnet/scottgublog/20090828vs10net4/vs10net4.html]]
--[[VS2010の各エディションの比較:http://www.microsoft.com/japan/visualstudio/products]]
--[[VS2010キーボードショートカットポスター:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=92CED922-D505-457A-8C9C-84036160639F&displaylang=en]]

個人的に引っかかったところ
-タスク一覧が出ない : 標準ではタスク一覧のコメントに
 // HACK 〜
などでマークしたものがでない.~
[解決策] ツール->オプションでテキスト エディター -> C/C++ -> 書式設定の"コメント タスクの列挙" を "True" にする.
#ref(vs2010_comment.jpg);
-warning MSB8012~
VS2008では設定でリンカ->全般->出力ファイルに設定した値が$(TargetPath)として設定され,
IDEからビルドされたファイルを実行する際にこの値が用いられていた(設定のデバッグ->コマンド).
VS2010では設定の全般でターゲット名$(TargetName)とターゲットの拡張子$(TargetExt)が設定され,
これらから$(TargetPath)が設定される.
VS2008から移行した場合,リンカの出力ファイルと$(TargetPath)が異なっていることがあり,
この場合に"warning MSB8012"が出る.~
[解決策] リンカの出力ファイルを
 $(OutDir)$(TargetName)$(TargetExt)
か
 $(TargetPath)
にして,出力ファイル名を変えるときは全般のターゲット名を変更する.


**Microsoft Visual Studio Version Selectorの実体 [#o16fec80]
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


**ショートカットキー [#s4929daf]
-キーワード検索 [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 について [#w783de69]
  warning C4819 : ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
「/*」の後に「+」とか「|」とかの文字が隣接してると駄目っぽい.例えば「/*|」->「/* |」にすれば警告は止まる.
「|*」でも駄目っぽい.「| *」ならOK?

**warning LNK4221 について [#ef637ed3]
 warning LNK4221: パブリック シンボルが見つかりませんでした。アーカイブ メンバにアクセスできません。

 aaa.h
 aaa.cpp
でaaa.cppの中身が
 #include "aaa.h"
だけのときにでる?
[[スタティック ライブラリにリソースを追加するとき、「 LNK4221」メッセージ警告リンカ ツールを表示します。:http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B815773]]

**warning LNK4006 について [#p2d5428f]
スタティックライブラリを作成するプロジェクトにスタティックライブラリ(*.lib)を追加の依存ファイルとして指定していた場合に出る.例えば,a.libというライブラリをb.libというライブラリを作成するプロジェクトBから呼んでいて,b.libはc.dll or c.exeを生成するプロジェクトCから呼ぶという構造の場合,a.libはプロジェクトCのみから呼ぶようにして,プロジェクトBからは呼ばない要にする.つまり,最終的なdll,exeのプロジェクトのみからすべてのスタティックライブラリを呼ぶようにする.
上記の例ではプロジェクトBのビルド時にリンクエラーが出そうだが,実際には出ない.また,この警告はVC6以前では出なかったらしい.

**pragma [#u26ad892]
-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の違い [#m4f86f92]
-参考:[[Visual Studio 2008 徹底入門 (1):http://codezine.jp/article/detail/2183]]~
[[Visual Studio 2008 徹底入門 (2):http://codezine.jp/article/detail/2184]]~
[[Visual Studio 2008に搭載された17の新機能:http://www.atmarkit.co.jp/fdotnet/special/visualstudio2008_01/visualstudio2008_01_01.html]]
-起動が速い
-インテリセンスウィンドウを透明化(Ctrlを押す)できる
-コンパイル速度が速い -> [http://d.hatena.ne.jp/Wacky/20080101/1199164833]
-安定性の向上
-ASP.NET AJAXの正式対応,JavaScriptコードのデバッグなど
-Visual Studio Tools for Officeの標準搭載(VS2005は別売り)
-単体テスト機能(Professional Edition以上)


**タスク一覧とブックマーク [#e8d5c2be]
「表示→タスク一覧」 でタスク一覧ウィンドウがでる.
ウィンドウ上部が「ユーザータスク」となっていたら「コメント」に変える.
コード上のコメントで,
 // HACK:ここを変更
などのように記述すれば行番号とともに一覧表示される.
ダブルクリックすればその場所に移動する.コードが長くなってきたら便利.
また,「ツール→オプション」のオプションウィンドウで,「環境→タスク一覧」でオリジナルのキーワード(トークン)を追加できる.

**コード定義ウィンドウ [#adb44047]
「表示→コード定義ウィンドウ」でコード定義ウィンドウが表示される.
コード中の関数呼び出し部などをクリックするとその実装の中身などがすぐに見られる.

**正規表現検索 [#f5c45995]
Ctrl-Fの検索ウィンドウやCtrl-Rの検索と置換ウィンドウでは文字列検索を行えるが,ウィンドウ一番下の条件チェックをオンにして「正規表現」を選ぶと正規表現による検索,置換ができる.
例えば,/* */ の一行コメントを // に置き換える場合,
検索する文字列に
 /\* {.*} \*/
 /\* (.*) \*/
置換後の文字列に
 // \1
 // $1
とすればよい.

ちなみに上記の例はVisual Studio 2012以降で,それ以前のVisual Studioの場合は,
検索側
 /\* {.*} \*/
置換後
 // \1
であった.

そのほか,Visual Studio独自の表現として以下のようなものがある.
-{} タグ付き正規表現(かっこ内の正規表現でタグ付けされた文字列を検索)
-() タグ付き正規表現.かっこ内の正規表現でタグ付けされた文字列を検索(VS2010以前は"{}")
-:i C/C++識別子([a-zA-Z_$][a-zA-Z0-9_$]*)
-:q 引用符で囲まれた文字列( ("[^"]*")|('[^']*') )
-:b スペースまたはタブ
-:z 整数(符号なし10進整数 ([0-9]+) )
-\n n番目のタグ付き正規表現.検索側で{}でタグ付けされた文字列を置換側で\1,\2と指定する.
-$n n番目のタグ付き正規表現.検索側で{}でタグ付けされた文字列を置換側で$1,$2と指定(VS2010以前は\n)
-\(w,n) 右揃え.置換で,n番目のタグ付き正規表現を,少なくとも w 文字分の幅があるフィールドで右揃えする.
-\(-w,n) 左揃え.置換で,n 番目のタグ付き正規表現を,少なくとも w 文字分の幅があるフィールドで左揃えする.
-~(X) 対象外.文字列でこの位置に X がある場合は検索しない.
例えば,real~(ity) では,"realty" や "really" の "real" は検索されるが,"reality" の "real" は検索されない.
-:d 10進数([0-9])
-:h 16進数([0-9a-fA-F]+)
-:n 有理数( ([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+) )

**クリップボードリング [#kf5db1e4]
Visual Studio内蔵のクリップボード履歴機能.貼り付けるときにCtrl+Vでなく,Ctrl+Shift+Vを押し,
CtrlとShiftを押したままVを押し直すと最大過去20個の履歴が次々出てくる.

**コード整形 [#lb4db6a5]
「編集→詳細→選択範囲のフォーマット」で字下げなどを整えてくれる.
Visual C#ならば,間のスペースなどもっと細かいものをオプションウィンドウで指定できる.



*リンク [#hd4baa18]
-[[MSDN:http://www.microsoft.com/japan/msdn/]]
-[[Visual Studio 2005 Tips:http://www.microsoft.com/japan/msdn/events/online/thisweek/vstips/]]
-[[@IT:http://www.atmarkit.co.jp/index.html]]~
[[Visual Studio:http://www.atmarkit.co.jp/channel/vstudio/vstudio.html]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS