Visual Studio 2017 による C++ 開発 まとめ

#はじめに
Visual Studio 2017 ですが、「主要言語」としては Visual C#, Visual Basic, Visual C++ がサポートされています。このうち、C# と VB は .NET Framework をターゲットにしています。一方、Visual C++ は Win32 を主にターゲットにしています。

Windows のネイティブ環境は Win32 なので、Visual C++ を使ってアプリを作成すると、より高速なアプリを構築できます。

とは言え、近年、Windows では .NET Framework が主流で、Win32 でアプリを開発することは少なくなりました。

Visual C++ を使っての開発となると、特別なデスクトップアプリ (高速性が必要で画面も比較的複雑なものなど) や過去の資産を流用するアプリとかぐらいでしょうか。

#Visual C++ プロジェクトの種類
Visual Studio 2017 の「新しいプロジェクト」ダイアログですが、下の画像のようになっています。ただし、CLR と MFC は標準ではインストールされておらず、[Visual Studio インストーラを使ってインストールする](https://qiita.com/tadnakam/items/042c7a19bf115e3b096f) 必要があります。

![VCProj.png](https://qiita-image-store.s3.amazonaws.com/0/62802/8d5b5666-1363-6845-4c81-96ec16892577.png)

##ATL
これは Active Template Library のことで、COM コンポーネントを作成するのに使います。COM コンポーネントを利用すると .NET Framework のアプリから Win32 の機能を容易に利用できます。
![VCProj_ATL.png](https://qiita-image-store.s3.amazonaws.com/0/62802/2762b326-f4d0-c528-7ee1-96aeb58e13cf.png)


##CLR
CLR は Common Language Runtime のことです。これは .NET Framework と Win32 の両方を使うアプリ向けにクラスライブラリを作ったり、C++ で .NET Framework のクラスライブラリを利用するコンソールアプリを作ったりするのに使用します。
![VCProj_CLR.png](https://qiita-image-store.s3.amazonaws.com/0/62802/25963f1e-5ae5-7b1a-e7a1-58594c035c7f.png)


##全般
![VCProj_Common.png](https://qiita-image-store.s3.amazonaws.com/0/62802/2101a794-5eff-b821-1336-2527bc6abd67.png)


##MFC
MFC は Microsoft Foundation Class の略で、Win32 API を直接使用せずにデスクトップアプリなどを開発するのに使用します。
![VCProj_MFC.png](https://qiita-image-store.s3.amazonaws.com/0/62802/6fe97499-0314-7d57-a075-14056bef6f87.png)

##テスト
![VCProj_Test.png](https://qiita-image-store.s3.amazonaws.com/0/62802/b641a9ed-fe6e-7f24-35a0-0bf0bd712f39.png)


##Win32
これは、Win32 API を直接使用してデスクトップアプリやコンソールアプリを作成するのに使用します。
![VCProj_Win32.png](https://qiita-image-store.s3.amazonaws.com/0/62802/cafc919b-a006-7aaa-ae83-2fda60a6664e.png)


##クロスプラットフォーム - Linux
これは Linux で動作するアプリを Visual Studio 2017 で開発するための機能です。詳しくは [Visual Studio 2017 の Linux C++ 開発機能](https://qiita.com/tadnakam/items/4660d8fa5b1b72f9eb70) 参照。
![VCProj_Linux.png](https://qiita-image-store.s3.amazonaws.com/0/62802/67eafecc-6d3d-4d04-a8bf-12aa0cd9b177.png)


#Visual C++ による Windows 開発の問題点

##ポインタ
Windows 開発だけの問題ではないのですが、C/C++ はマネージ言語でないのでポインタをよく使います。これは便利な反面、危険な機能でもあるので、よく考えながらプログラミングしないと、プログラムがすぐクラッシュしたりします。

できれば、CPU の動作を想像し、機械語 (アセンブラ) をイメージしながらプログラミングするといいですが、そこまでやるのも大変です。

##C++ が複雑
C++ は C を拡張してオブジェクト指向機能を追加したのですが、その他にテンプレート機能も追加されています。このため、シンプルな C に比べて「巨大な」言語になっていて、いろいろ難解な面があります。

##Win32 API
Win32 API は C 言語用の API で、元となる Win16 は 1980 年代終わりごろに策定されたものと思います。(Windows 1.0 は 1985 年発売)

このため、あまり洗練されておらず、複雑で使いづらいです。しかも、非常に多くの関数からなっており、Windows の内部動作を知ってないと、これらの関数を使いこなすのは困難です。

##MFC
MFC は Win32 API をカプセル化したクラスライブラリで、これを使えば本来なら簡単に Windows アプリを構築できるはずですが、実際にはそうではなく、Win32 API を知っていないと使いこなせません。というのは、MFC は Win32 API の薄いラッパー (Wrapper) で、Win32 API 関数の知識が必要なためです。

##実は Visual でない Visual C++
Visual C++ は Visual Basic のように画面のデザインとプログラミングをできません。 Visual C++ でできるのは「画面のリソース」の編集をビジュアルにできるだけです。

このため、プロパティで設定できない項目も多数あって、どうやってプロパティを設定したらいいかわかりません。(たいていは Win32 API 関数やそれに対応する MFC のメソッドを呼び出す必要がある)

##ATL もある
これは主に COM コンポーネントを作るのに使います。知らなくても、Win32 アプリケーションを作ることはできますが、COM コンポーネントを作る際には、COM の知識とともにライブラリの知識が必要です。

-