稲枝の押入れ

いなえが適当なことを書いては、しまっておく場所

VSゆるゆるTIPS

はじめに

この記事はの23日目の記事として書かれたものです。

前日の記事はとっちーの です。なんか記事が間に合わないとか言ってました。計画性のない奴ですね、まったく。

ごめんなさい

この記事はやる気0の状態で書かれたものです。ゆるゆるですがゆるして。
(登録したものの特に書くことが思いつかないまま当日になってました。こういう計画が出来ないところがお茶目ですね)

なんとなくVisual Studioについて書きます。(C++でゲームとかツールを作ったりしてるけどGUIをなんとなく使っててVSよくわからんなあという初心者を想定してます)
ほとんど説明するつもりはなくて、こういうものもあるよという紹介です。自分で調べてちょ。

ソリューションとプロジェクト

ソースコード等のまとまった単位をプロジェクトといい、プロジェクトを幾つも束ねたものをソリューションといいます。
例えば、ライブラリとして使うようなコードを集めたプロジェクトと、ゲーム本体を作るためのプロジェクト、ツール用のプロジェクト、を束ねたソリューション、という感じで使ったりします。

ビルド

構成にしたがってプロジェクトをコンパイル&リンク等することをVSではビルドと呼んでます。
複数のプロジェクトがソリューションにある場合はちゃんとビルドするプロジェクトを選ぼうね。
F5Ctrl+F5デバッグ実行もしくは実行されるのはスタートアッププロジェクトに設定されているプロジェクトなので、ここもしっかり設定しておきましょう。 (プロジェクト右クリックからの「スタートアッププロジェクトに設定」)

構成とプラットフォーム

VSでは、構成とプラットフォームという2つの組でビルド時のオプション等を設定できます。
例えば、この構成とこの対象プラットフォームの時は最適化を有効にする、という感じです。
最適化の有無以外にも、ビルド時マクロを設定したり、コンパイルオプション等を設定できます。
具体的には、構成はDebug,Release、プラットフォームはx64,x86等がデフォルトで生成されたりします(VSの上のほうに表示されてるあれです)
構成とプラットフォームは、ソリューション向けのものとプロジェクト向けのものがあります。
ソリューションの任意の構成とプラットフォームに対して、それぞれのプロジェクトの構成とプラットフォームを設定できます。

変更を反映

Alt+F10で変更を反映できるよ。
「ドラえも~ん、コンパイルしなおしたくないよお~」
って時にたまに便利

単体コンパイル

単一ソースがコンパイル通るか確認したいだけの時はこれでもいいかも。Ctrl+F7です。

コンパイル対象

どのソースコードコンパイルされているか認識していますか?
例えば、既に正常にビルドされるピロジェクトに、VS上からhoge.hを新規作成したとして、

void void ほげ(int ふが){
    bool poyo = ふが+3.0;
    return yahoo;
}

と書いたとしたらコンパイルは通るでしょうか。
やってみたらわかると思いますが、通ります。これはなぜかというと、hoge.hがビルドの要素に含まれていないからですね。
hoge.hを適当な.cppでincludeしたらビルドエラーになるかと思います。
VSでは、どのファイルをコンパイルしてどのファイルをコンパイルしないかをファイルの種類からいい感じに察してビルドしてくれている感じなのです。
デフォルトだと、.cppで作成したファイルがコンパイル対象で、.hで作成したファイルはコンパイル対象ではありません。
実際はファイルごとにコンパイルするか否かの設定をプロジェクトが持っています。
気になる人はソースファイルを右クリックしてプロパティを開くか、プロジェクトファイル周りを見るといいと思います。

ファイル

VSのファイルというと以下のような感じ

  • .sln
  • .vcxproj
  • .vcxproj.filters
  • .vcxproj.user
  • .vcxitems

https://docs.microsoft.com/ja-jp/cpp/build/reference/project-and-solution-files?view=vs-2019

.sln

ソリューションファイル。ソリューションの情報を持つ(保持するプロジェクトはどれ、とか)。

.vcxproj

プロジェクトファイル。プロジェクトの情報を持つ。

.vcxproj.filters

プロジェクトのフィルタファイル

ソリューションに追加されたファイルを配置する場所を指定します

とのこと。
VS上での表示や、ファイル種別の情報など一部のフィルタ情報はプロジェクトファイルではなくこちらでもっている。
VSのソリューションエクスプローラー上での階層表示を保持するのに使ってるくらいにおもっときゃよさそう。

.vcxproj.user

移行ユーザー ファイル らしい。

.vcxitems

共有アイテムプロジェクトファイル。共有プロジェクトを作った時に生成されるプロジェクトファイル的なもの。
共有プロジェクトは単体でビルドされないので持ってる情報が違う。

デバッグ

便利な機能たくさんあるから使おう。

ブレークポイント

みんな大好き。F9でカーソルのある行に貼れる。プログラムがそこに来たら止まるよ。

条件ブレークポイント

「ここに来た時、xが2の時だけ止めたい」とかもできる。

データブレークポイント

「ここのデータが変更されたときに止めたい」とかもできる。ただし、ブレークポイントが保持する情報がポインタなので、実行するたびに作り直さないといけない(多分)

4バイトまでしか変更を検知できない…とおもったらVS2019では8バイトまでいけたので記憶違いかも。

ステップイン/アウト/オーバー

ブレークポイントとかで止めてから、コードを1行ずつ実行したり出来る。便利。

ウォッチ式

ある変数の値とかを書いておくことで簡単に確認できる。
デバッグ>ウィンドウ>ウォッチ
か、Ctrl+Alt+W,[数字]でウォッチのウィンドウを出せる。
ここにたとえば

hoge.piyo.x

みたいに書いておくとxの値を表示できる。デバッグプリントより楽だしこっちのほうが便利な場合も多い(ソースコード汚さないし)。

UTF-8文字列をウォッチ式で出す

ウォッチ式とかのデバッグ機能だと、日本語は文字化けして見れないことが多い(ASCII OnlyなのかShift_JISとかなのかは把握してないです)

(hoge),s8

他にも色々あるよ(こことか参照)

VSはデフォルトだとソースコードShift_JISになってる謎仕様なので注意。しかもUTF-8はBOMつきじゃないと正しく動かないことが多い(VS2019とかだとなおってるのだろうか)。

UTF-8で開発したいだけなのに、何故かそれをするのに苦労する開発環境VS。
なぜ山に登るのか、そこに山があるからだ、という問答が頭をよぎった。

デバッグで関数を動かす

ウォッチ式とかに関数を入れてその結果を見たりもできるよ。あんま気づいてない人いそう。
プログラム止まってるので呼べないものもあるけど意外と呼べたりする。
例えば

int sum(int a, int b) {
    return a + b;
}

ってコードがあったとして、ウォッチウィンドウで

sum(3,5)

って書くとちゃんと8って値が見れる。メンバ関数とかでも使えたはず(特にconst関数だとうまくいく率高かった記憶)。

スタックトレース

どこかで実行を止めたときに、その処理がどこから呼ばれて実行されているかといった情報が見れる。
上のメニューから
デバッグ>ウィンドウ>呼び出し履歴
を選ぶか、Ctrl+Alt+Cで出せる。
デバッグ系のウィンドウはデバッグ実行してないと開けないものが多いので、適当にブレークポイント貼るなり一時停止するなりして開こう。

メモリウィンドウ

上のメニューから
デバッグ>ウィンドウ>メモリ
か、Ctrl+Alt+M,[数字]で出せる。数字はメモリの指定。実際にメモリにどうデータが乗っているのか直接見れるよ。編集もできたはず。
ステップ実行とかすると値の変わったところの色が変わったりするよ

スレッドウィンドウ

マルチスレッド開発とかしてるとスレッドごとの状態が見たかったりとかすると思うけど、単純なスタックトレースだとそれはみにくいのでスレッドウィンドウがあったりして便利
デバッグ>ウィンドウ>スレッド
で見れるよ。確かデフォルトの設定だとブレークポイント貼ったら全部のスレッドが止まるようになってたはずだからいい感じに活用しよう。

グラフィックスデバッグ

この画面のこのピクセルはこのドローコールで書かれたよ、みたいな情報を見れる。
DirectX直叩きしてるときとかは特に重宝すると思います。
デバッグ>グラフィックス
あたりからどうぞ

アセンブル

デバッグ>ウィンドウ>逆アセンブル
か、Ctrl+Alt+Dで開ける

おしまい

面倒くさくなってきたのでこの辺りにします。
いやほんまに雑な記事で申し訳ない。言い訳なんですがリアルがバタバタしてて書く暇なかったんです。
まだまだ便利機能があるんですが、何かとセンスのない感じだったりドキュメントが不親切だったりで意外と知らないことが多いので「こんな機能ないかな~」と思ったら調べてみることをお勧めします。

あと、VsVimを入れましょう