Microsoft Visual C++

Visual C++ とはマイクロソフト製のC、C++、C++/CLI用統合開発環境  であり、コンパイラやデバッガを含む。通称VCあるいはVC++、MSVCなど。前身はMicrosoft C/C++などがある。

1. 概要
-----

事実上のWindowsの標準開発環境であり、その最適化性能は非常に高い。Visual C++ 7.1  からは標準C++規格への準拠度が大きく改善されている。同じバージョンでもいくつかのエディションが存在し、以前は上位エディションしか最適化をサポートしていなかったが、Visual C++ 2005から基本的な最適化はExpressを含む全てのエディションにおいて行なえるようになった。ただし、2005で導入されたプロファイリングに基づく最適化  は上位エディションのみでサポートされている。

Visual C++ 2005以降はVisual BasicやVisual C#などの他の開発言語と統合されたVisual Studioのパッケージとして販売されている。Visual C++ .NET 2003までは言語別製品として販売されていたが、2005以降は行なわれていない。販売されているVisual Studioパッケージから機能を制限した無料版のVisual C++ Express Editionが入手できる。

"Visual"という名称が付けられているが、Visual Basicなどと違ってRADではなく、基本的にはWindows SDK  やMFCを使用してコードベースのプログラムを作成することになる。MFCはC++専用クラスライブラリであり、アプリケーションフレームワークの役目も担っているが、基本的にWindows APIの薄いラッパーでしかないため、生産性の点でVisual BasicやDelphiのようなRADに及ばない。しかし、Visual C++ 7.0  以降は、後述するマネージ拡張C++あるいはC++/CLIを使用してWindows Formsアプリケーションを開発する場合に限って、フォームエディタを始めとしたVisual C#やVB.NETのようなRAD環境を使用できる。また、Visual C++ 11.0  以降は、後述するC++/CXを使用してWindowsストアアプリを開発する場合、XAMLエディタを始めとしたRAD環境を使用できる。

また、旧来のWin32/MFCアプリケーションに共通言語基盤  のサポートを追加することで、.NET Frameworkのクラスライブラリを併用するハイブリッド開発も行なえる。これにより、例えばVisual C#/VB.NETで.NET基本クラスライブラリを使って開発したロジックライブラリや、Windows Forms/WPFを使って開発したGUI部品を、Win32/MFCアプリケーションで利用する、という相互運用が可能となっている。

Visual C++ 8.0  以降は64ビット命令の生成に対応している。付属するコンパイラには、コンパイラが動作する環境と同じネイティブコードを生成するものと、32bit  環境で動作して 64bit  ネイティブコードを出力するもの  がある。32ビット  環境上であってもクロスコンパイルすることができる。Visual C++ 11.0  以降はARMプロセッサ向けのコード生成にも対応している。Visual C++ 14.1  以降では、ARM64アーキテクチャのネイティブアプリケーション開発にも対応した 。

Windows用マルチメディアコンポーネントであるDirectXを使用してアプリケーション開発を行う場合に必要となるヘッダーファイルなどはWindows SDKに含まれているが、DirectX API は主にVisual C++シリーズで利用されることを前提に開発されているため、親和性が非常に高い。なお、Windows SDK 7.1までは最新のDirectX APIや各種ツール類を使用する場合は単独のDirectX SDKを別途インストールする必要があったが、Windows SDK 8.0以降は最新のヘッダーおよびインポートライブラリファイルや各種ツール類がWindows SDKに含まれるようになった。

Visual Studio 2015では、AndroidおよびiOS向けのモバイルアプリケーションを開発できるようになった。ビルドシステムとしてMSBuildが使われるが、コンパイラはMSVCではなくClangが使われる。

2. 言語
-----

Visual C++のコンパイラは、C, C++, C++/CLI, C++/CXのソースコードを入力に受け付ける。

C言語規格に関しては、Visual C++ 9.0  SP1の時点ではANSI C89  対応であり、C99やC11には対応していない。Visual C++ 12.0  では、全てではないがC99の関数の大半を追加した。Visual C++ 14.1  では、C99プリプロセッサの部分的なサポートが追加された 。Visual C++ 14.2  では、C11/C17の必須機能のサポートが追加された 。

C++言語規格に関しては、Visual C++ 9.0  SP1の時点でC++98  規格に対応している。Visual C++ 10.0  では、auto、decltype、ラムダ式、rvalue reference、static_assert、nullptrなど、C++11規格で追加された機能を一部規格制定に先行して実装した。Visual C++ 11.0  では、Strongly typed enums、Forward declared enums、Standard-layout and trivial types、Range-based for-loop などのC++11規格を実装した。Visual C++ 12.0  では、Initializer lists、Alias templates、Delegating constructors、Raw string literals などのC++11規格を追加実装した。Visual C++ 14.0  では、constexpr、Unicode string literalsなどのC++11規格を追加実装し、またBinary literalsなどのC++14規格を一部実装した。Visual Studio 2017 15.0のVisual C++ 14.1  では、C++14規格の追加機能をすべてサポートしたが、C++11規格の一部がサポートされていない。Visual Studio 2017 15.7においてC++17規格の追加機能をすべてサポートしたが、C++11規格のうちC99プリプロセッサ  がサポートされていない。また、__cplusplusの定義値は既定で199711Lとなっているが、コンパイルオプション/Zc:__cplusplusを指定することで、C++言語標準モード設定に応じて201402Lなどに変化する。

2.1. 主なコンパイラの拡張
---------------

インラインアセンブラ_asmや__asmキーワードによる記述。C++の標準規格で定められているasm文には対応していない。x64/IA64では使用できず、別途アセンブラで記述するか組込関数で代替する。コンパイラCOM対応ディレクティブ及び追加のクラス・関数など。属性マイクロソフトインターフェイス定義言語MIDLの属性を直接C++ソースコードに記述する機能。なお、マネージ拡張C++、C++/CLI、およびC++/CXの属性も同様の構文を使用する。OpenMPVisual C++ 2005からOpen MP 2.0に対応している。2010まではProfessional以上のエディションでのみ使用可能となっていたが、2012ではExpressを含む全エディションで使用が可能となった。ネイティブC++でのC++/CLI構文の使用for each及びoverride, abstract, sealed。このうち、overrideはC++11のoverrideと同様の構文である。また、sealedはC++11のfinalキーワードに相当する。Visual C++ 2012では、sealed、finalのうちどちらでも使うことができるが、標準C++クラスにはfinalを、C++/CXのrefクラスにはsealedを使うことが推奨されている。Type Traits対応__is_podキーワードなど。.NET/WinRT対応後述する。その他__declspec、呼出規約の指定、プロパティ構文、構造化例外処理、#pragmaディレクティブ、SAL注釈など。

2.2. 主なライブラリの拡張
---------------

追加のCRT関数MS-DOS時代に由来するもの、POSIX互換のもの、セキュリティ強化のためのものなどコンパイラ組込関数MMX, SSE, SSE2やその他CPU命令に対応するものstdext名前空間hash_map, hash_setなどmsclr名前空間C++マネージ拡張およびC++/CLI用の追加ライブラリ STL/CLRC++/CLIでのSTL風のライブラリ 同時実行ランタイム 並列パターンライブラリなどから構成される、C++11ベースの並列処理ライブラリ C++ AMPGPUなどのアクセラレータを使った並列処理ライブラリ特に、Visual C++ 2005ではバッファオーバーフローやマルチスレッドでの安全性の向上のため、大幅なライブラリの拡張が行われた。Cの関数にはstrcpyに対してstrcpy_sのように末尾に_sを追加した名称のものが該当し、その大半はISO Cの標準化委員会へTR 24731として提案されている。また、C++でも_sを付けたメンバ関数の追加や範囲チェック付イテレータなどの追加が行われている。

なお、Visual C++ 2008にService Pack 1  を適用すると、C++0x TR1対応ライブラリや、MFCでのVisual Studio風スマートドッキングウィンドウおよびOffice 2007風リボンインターフェイス作成のための拡張パッケージが追加される。また、Visual C++ 2010にSP1を適用すると、Direct2DやWindows Animation ManagerのMFC用ラッパークラスが追加される。

2.3. マネージ拡張C++
--------------

マネージ拡張C++  は.NET Frameworkに対応したアプリケーションを作成するため、C++を共通言語仕様CLSに準拠させるために独自の拡張を施したものであり、Visual C++ .NET 2002以降に搭載されている。これに対し従来のC++をマネージ拡張C++と区別する際にはネイティブC++  と呼ぶ。1つのアプリケーション内にマネージ拡張C++とネイティブC++のコードを混在させることも可能であり、従来のC++で書かれたコードを徐々に.NETへ移行したり、あるいは他の.NET言語からC++で作られたライブラリを使用したり、C++コードから.NET Frameworkのクラスライブラリを活用するなどといったことを可能にしている。後継となるC++/CLIの登場により、マネージ拡張C++の使用は推奨されなくなっている。Visual C++ 2005-2013では、非推奨ではあるが互換性維持のため従来のマネージ拡張C++のソースコードもコンパイルオプション「/clr:oldSyntax」を指定することでコンパイルできるが、Visual C++ 2015で廃止された。

2.4. C++/CLI
------------

C++/CLIはマネージ拡張C++に代わる、CLSを満たすC++を基にしたプログラミング言語であり、Visual C++ 2005以降に搭載されている。なおC++/CLI環境では、従来のC++はアンマネージではなくネイティブと形容される。

2.5. C++/CX
-----------

C++/CX  は、Windowsストアアプリ  で使用されるWindowsランタイム  ライブラリを効率よく利用するために、C++11規格をベースとして拡張されたプログラミング言語であり、Visual C++ 2012以降に搭載されている。なお、言語構文は前述のC++/CLIとよく似ているが、C++/CXはC++/CLIとは違ってマネージ言語ではなく、ネイティブ拡張である。そのため、従来のネイティブC/C++用コードやCRTライブラリはほぼそのまま利用できるが、.NET Frameworkを直接扱うことはできない。また、C++/CLIとは同一ソースコード内に共存できない。Windowsランタイムコンポーネント  を通じてC#やVB.NETと相互運用することができる。

2.6. C++/WinRT
--------------

Visual Studio 2015 Update 3以降では、C++/CX言語拡張を使わずに、C++/WinRTと呼ばれる拡張ライブラリを用いてUWPアプリを開発することも可能となっている。C++/WinRTはC++17準拠コンパイラを必要とする。

2.7. その他の機能・特徴
--------------

32ビット/64ビット向けのVisual C++では、C/C++のlong double型は互換性のためだけに残されており、80ビットの拡張倍精度や128ビットの四倍精度をサポートしない。

Visual C++ 2005以降は/archコンパイルオプションによって、コンパイラは必要に応じて浮動小数演算にFPUでなくSSE/SSE2を使ったコードを出力できるようになるが、x64のようにすべての浮動小数演算命令がSSE2になるとは限らない。また、Visual C++ 2010以降はAVX命令の使用もサポートしている。Visual C++ 2013 Update 2以降はAVX2命令の使用もサポートしている。

3. 無料版
------

Visual C++はエディションによってサポートする機能に違いがあるが、プログラミング初心者やアップグレード検討者向けに、Windows用クラスライブラリなどが付属しない無料版がマイクロソフトによって公開されている。無料版といえど、バージョンアップのたびに標準サポートされる機能が追加されており、VC 2005以降ではIDEのIntellisenseやデバッガなどの基本機能はStandardエディション以上の有料版と変わらず、簡単なアプリケーションやライブラリを作成するには必要十分といえる。なおExpressエディションの提供はバージョン2013までとなり、以降はCommunityエディションに統合される予定だったが、その後撤回され、Visual Studio 2015においてもExpressエディションが提供されることになった。

Visual C++ ToolKit 20032003年にプロフェッショナル版と同等の最適化機能のあるコンパイラが無料で提供された。ただし、それ以前から.NET Framework SDKにスタンダード版相当のコンパイラが付属していた。なお、後述するVisual C++ 2005 Express Editionの公開に伴って、現在はこちらの公開は終了している。Visual C++ 2005 Express Edition2005年12月からIDEが付いて無料で公開され、2009年3月31日に配布を終了した。マイクロソフトがIDE製品の正式版を無料で公開したのはeMbedded Visual Toolsに続いてこれが2作目である。なお、MFCとATLは付属していない。また、Windows APIを用いたプログラムを作成するには別途Windows SDKをインストールする必要がある。Visual C++ 2008 Express Edition2007年12月18日公開。ATLやMFCが付属しない点はVisual C++ 2005 Express Editionと同じであるが、Windows SDKが標準で同梱されるようになり、Win32アプリケーションの開発に必要なWindows SDKを別途用意する必要がなくなった。Microsoft Visual C++ Compiler for Python 2.7Windows版Pythonの拡張モジュールのバイナリパッケージはPythonのバージョンとCランライムライブラリのバージョンに強い依存関係があり、それに対応するために配布されている。VC++ 2008のコンパイラに相当し、IDEは付属しない。Visual C++ 2010 Express2010年4月28日公開。Visual C++ ソリューションおよびプロジェクトがXMLベースのMSBuildを使用してビルドするようになり、他のVisual Studio言語で使用されるビルドシステムと同じになった。Visual Studio Express 2012 for Windows 8Visual Studio Express 2012 for Windows Desktop2012年9月12日公開。今バージョンではVisual C++単独の製品は無くなりC#、
VB.NETと共にインストールされる。Visual Studio Express 2013 for WindowsVisual Studio Express 2013 for Windows Desktop2013年10月17日公開。Visual Studio Community 20132014年11月13日公開。Expressエディションと比較して利用規約は厳しくなっているが、機能的にはProfessional版と同等。これまで有償版でしか使えなかったMFC、ATLも付属する。Visual Studio Express 2015 for WindowsVisual Studio Express 2015 for DesktopVisual Studio Community 20152015年7月20日公開。Visual C++ Build Tools 2015VC++ 2015のコンパイラに相当する。IDEは付属しないがATLとMFCが付属している。Visual Studio Community 2017Visual C++ Build Tools 2017Visual Studio Express 2017 for Windows DesktopBuild Tools for Visual Studio 2019ほかにも、バージョン7.1までの Windows SDK  とバージョン7.1までのWindows Driver KitにもVisual C++コンパイラが付属していた。 またバージョン10 1511のWindows Driver KitからはEnterprise Windows Driver Kitと呼ばれるコンパイラ等が付属するバージョンのWDKの配布が再開された。

Visual C++ Build Toolsは、ビルドサーバーや継続的インテグレーション  等、GUIを使用せずバッチ処理的にビルドを行う環境での使用を意図されたものである。統合開発環境を含む通常のVisual Studioを補完する製品という位置付けであり、Visual Studioの正規ユーザーが使用することが前提になっている。

4. 製品バージョンと内部バージョン
------------------

Visual C++の製品バージョンは、バージョン6.0までは内部バージョンと同じ番号が付けられていたが、2002以降は内部バージョンではなくリリース予定年を冠するようになった。なお、Visual C++にはコンパイラのバージョンを表す _MSC_VER および _MSC_FULL_VER というプリプロセッサ シンボルが存在するが、これはVisual C++の前身であるMS-DOS用C/C++コンパイラからの通し番号となっており、コンパイラ本体である cl.exe のファイルバージョンを表している。



5. ランタイムライブラリの互換性
-----------------

Visual C++  のCRT  ライブラリは、コンパイルオプションによって静的リンクあるいは動的リンクを選択することができる。DLLおよびEXEにVCランタイムを動的リンクする場合、DLL/EXE自体のファイルサイズを削減できるなどのメリットがあるが、アプリケーションの実行にはVCバージョンごとのランタイムライブラリモジュールが実行環境に必要となる。MFC/CLR/OpenMP/C++ AMPを利用して作成されたDLL/EXEの場合はさらにそれぞれのランタイムライブラリが必要となる。エンドユーザー環境向けにVCランタイムライブラリの再頒布可能  パッケージがインストーラー形式で提供されているが、このインストーラーにはデバッグバージョンのライブラリは含まれない。Windowsのバージョンによっては、特定のバージョンのVCランタイムのサブセットがシステムコンポーネントとしてプリインストールされている。

VCのランタイムライブラリは、バージョンごとにCRTオブジェクトのメモリ管理がなされていた。そのため、異なるバージョンのVC間でDLL境界を越えてCRTオブジェクトの寿命を管理することはできなかった。例えば古いバージョンのVCで作成されたDLL内でmalloc/newしたオブジェクトを、新しいバージョンのVCで作成されたアプリケーションでfree/deleteしたり、逆に新しいVCで作成されたDLL内でmalloc/newしたオブジェクトを、古いVCで作成されたアプリケーションでfree/deleteしたりすることは、ヒープ破壊などの実行時エラーや未定義動作を招く原因となる。メモリの確保と解放はモジュールごとに閉じていなければならず、モジュール外に確保と解放の処理を公開するためにはDLL関数によるラッピングが必要となる。

VC2015ではUniversal CRTが導入され、またVC2017およびVC2019ではランタイムに破壊的変更がなくVC2015との互換性があるため、一定の条件が満たされればDLL境界を越えてCRTオブジェクトの寿命を管理することができる。Windows 10の場合、Universal CRTはシステムコンポーネントとして標準インストールされているが、それよりも前のバージョンのWindowsではWindows Updateや再頒布可能パッケージによるシステムディレクトリへのインストール、あるいはアプリケーションごとのローカル配置などの手段を利用する必要がある。

6. 脚注
-----

7. 関連項目
-------

Microsoft Visual Studio
Microsoft Foundation Class
Active Template Library

8. 外部リンク
--------

[2]
[3]
[4]
[5]