Microsoft Visual C++

Visual C++ （マイクロソフト ビジュアル シープラスプラス；マイクロソフト ヴィジュアル シープラスプラス）とはマイクロソフト製のC、C++、C++/CLI用統合開発環境 (IDE) であり、コンパイラやデバッガを含む。通称VCあるいはVC++、MSVCなど。前身はMicrosoft C/C++などがある。

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

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 (Windows API) やMFCを使用してコードベースのプログラムを作成することになる（ただしリソースエディタを用いることで、ダイアログウィンドウやメニューの外観デザインのみを視覚的に行うことは以前からできた）。MFCはC++専用クラスライブラリであり、アプリケーションフレームワークの役目も担っているが、基本的にWindows APIの薄いラッパーでしかないため、生産性の点でVisual BasicやDelphiのようなRADに及ばない。しかし、Visual C++ 7.0 (.NET 2002) 以降は、後述するマネージ拡張C++あるいはC++/CLIを使用してWindows Formsアプリケーション（もしくはWindows Formsコンポーネント）を開発する場合に限って、フォームエディタを始めとしたVisual C#やVB.NETのようなRAD環境を使用できる。また、Visual C++ 11.0 (2012) 以降は、後述するC++/CXを使用してWindowsストアアプリを開発する場合、XAMLエディタを始めとしたRAD環境を使用できる。

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

Visual C++ 8.0 (2005) 以降は64ビット命令の生成に対応している。付属するコンパイラには、コンパイラが動作する環境と同じネイティブコードを生成するものと、32bit (x86) 環境で動作して 64bit (x64またはIA-64) ネイティブコードを出力するもの (クロスコンパイラ) がある。32ビット (x86) 環境上であってもクロスコンパイルすることができる。Visual C++ 11.0 (2012) 以降はARMプロセッサ向けのコード生成にも対応している。Visual C++ 14.1 (2017) 以降では、ARM64アーキテクチャのネイティブアプリケーション開発にも対応した (Visual Studio 2017 v15.9以降が必要)Microsoft、「Visual Studio 2017 15.9」でArm64アプリ開発を正式サポート：64bit Armアプリの作成が容易に - ＠IT。

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

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

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

C言語規格に関しては、Visual C++ 9.0 (2008) SP1の時点ではANSI C89 (ISO C90, ISO/IEC 9899:1990) 対応ANSI Conformance | Microsoft Docsであり、C99やC11には対応していない（//で始まるコメントやlong long intなどは言語拡張としてサポートされている）。Visual C++ 12.0 (2013) では、全てではないがC99の関数の大半を追加したC99 library support in Visual Studio 2013 | C++ Team Blog。Visual C++ 14.1 (2017) では、C99プリプロセッサの部分的なサポートが追加された (Visual Studio 2017 v15.8以降)Microsoft C++ language and standard library conformance table | Microsoft Docs。Visual C++ 14.2 (2019) では、C11/C17の必須機能のサポートが追加された (Visual Studio 2019 v16.8以降)C11 and C17 Standard Support Arriving in MSVC | C++ Team Blog。

C++言語規格に関しては、Visual C++ 9.0 (2008) SP1の時点でC++98 (ISO/IEC 14882:1998) 規格に対応している。Visual C++ 10.0 (2010) では、auto、decltype、ラムダ式、rvalue reference（右辺値参照）、static_assert、nullptrなど、C++11規格で追加された機能を一部規格制定に先行して実装したVisual C++ 2010 の新機能。Visual C++ 11.0 (2012) では、Strongly typed enums、Forward declared enums、Standard-layout and trivial types、Range-based for-loop などのC++11規格を実装したC++11 Features in Visual C++ 11。Visual C++ 12.0 (2013) では、Initializer lists、Alias templates、Delegating constructors、Raw string literals などのC++11規格を追加実装したSupport For C++11 Features (Modern C++)。Visual C++ 14.0 (2015) では、constexpr、Unicode string literalsなどのC++11規格を追加実装し、またBinary literalsなどのC++14規格を一部実装したC++11/14/17 Features In VS 2015 RTM - Visual C++ Team Blog - Site Home - MSDN Blogs。Visual Studio 2017 15.0のVisual C++ 14.1 (2017) では、C++14規格の追加機能をすべてサポートしたが、C++11規格の一部がサポートされていないVisual Studio 2017 リリース ノート。Visual Studio 2017 15.7においてC++17規格の追加機能をすべてサポートしたが、C++11規格のうちC99プリプロセッサ (N1653) がサポートされていないVisual C++ Language Conformance | Microsoft DocsAnnouncing: MSVC Conforms to the C++ Standard | Visual C++ Team Blogコンパイラの実装状況 - cpprefjp C++日本語リファレンス。また、__cplusplusの定義値は既定で199711Lとなっているが、コンパイルオプション/Zc:__cplusplusを指定することで、C++言語標準モード設定に応じて201402Lなどに変化するMSVC now correctly reports __cplusplus | Visual C++ Team Blog。

 主なコンパイラの拡張 
インラインアセンブラ
_asmや__asmキーワードによる記述。C++の標準規格で定められているasm文には対応していない。x64/IA64では使用できず、別途アセンブラで記述するか組込関数で代替する。
コンパイラCOM対応
#importディレクティブ及び追加のクラス・関数など。
属性
マイクロソフトインターフェイス定義言語MIDLの属性を直接C++ソースコードに記述する機能。なお、マネージ拡張C++、C++/CLI、およびC++/CXの属性も同様の構文を使用する。
OpenMP
Visual C++ 2005からOpen MP 2.0に対応しているVisual C++ の OpenMP。2010まではProfessional以上のエディションでのみ使用可能となっていたがVisual C++ Editions (2005)Visual C++ Editions (2008)Visual C++ Editions (2010)、2012ではExpressを含む全エディションで使用が可能となったVisual C++ Tools and Templates in Visual Studio Editions。
ネイティブC++でのC++/CLI構文の使用
for eachHow to: Iterate Over STL Collection with for each及びoverride, abstract, sealedHow to: Declare Override Specifiers in Native Compilations。このうち、overrideはC++11のoverrideと同様の構文である。また、sealedはC++11のfinalキーワードに相当する（sealed自体はさらにもとを辿ればマイクロソフト発のプログラム言語C#からの由来である）。Visual C++ 2012では、sealed、finalのうちどちらでも使うことができるが、標準C++クラスにはfinalを、C++/CXのrefクラス（Windowsランタイムクラス）にはsealedを使うことが推奨されているsealed (C++ Component Extensions)。
Type Traits対応
__is_podキーワードなどCompiler Support for Type Traits。
.NET/WinRT対応
後述する。
その他
__declspec、呼出規約の指定、プロパティ構文（__declspec(property)）、構造化例外処理、#pragmaディレクティブ、SAL注釈SAL注釈など。

 主なライブラリの拡張 
追加のCRT関数
MS-DOS時代に由来するもの、POSIX互換のもの、セキュリティ強化のためのものなど
コンパイラ組込関数
MMX, SSE, SSE2やその他CPU命令に対応するもの
stdext名前空間
hash_map, hash_setなど
msclr名前空間
C++マネージ拡張およびC++/CLI用の追加ライブラリ msclr 名前空間
STL/CLR
C++/CLIでのSTL風のライブラリ STL/CLR ライブラリ リファレンス
同時実行ランタイム (Concurrency Runtime)
などから構成される、C++11ベースの並列処理ライブラリ 同時実行ランタイム
C++ AMP
GPUなどのアクセラレータを使った並列処理ライブラリ（言語拡張を含む）C++ AMP (C++ Accelerated Massive Parallelism)

特に、Visual C++ 2005ではバッファオーバーフローやマルチスレッドでの安全性の向上のため、大幅なライブラリの拡張が行われたCRTのセキュリティ強化Safe Libraries: Standard C++ Library。Cの関数にはstrcpyに対してstrcpy_sのように末尾に_sを追加した名称のものが該当し、その大半はISO Cの標準化委員会へTR 24731として提案されている。また、C++でも_sを付けたメンバ関数の追加（std::basic_istream::readに対して_Read_sのように）や範囲チェック付イテレータChecked Iteratorsなどの追加が行われている。

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

 マネージ拡張C++ 

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

 C++/CLI 

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

 C++/CX 

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

 C++/WinRT 

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

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

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

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

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

ほかにも、バージョン7.1までの Windows SDK (旧Platform SDK) とバージョン7.1までのWindows Driver KitにもVisual C++コンパイラが付属していた。
またバージョン10 1511のWindows Driver KitからはEnterprise Windows Driver Kitと呼ばれるコンパイラ等が付属するバージョンのWDKの配布が再開された。

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

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

+ Visual C++バージョンの履歴 製品名  製品バージョン  内部バージョン  _MSC_VER    備考 C Compiler 1.0  -  -  100    Latice Cを元にした MS-DOS用コンパイラ。K&R未対応。 C Compiler 2.0  -  -  200     Large Model 対応。 C Compiler 3.0  -  -  300  1985年  K&R対応。 C Compiler 4.0  -  -  400     オプティマイズ強化。ソースレベルデバッガのCodeViewを付属。 C Compiler 5.0  -  -  500  1987年  ループオプティマイズ。Huge Model対応。廉価版としてQuick C 1.0 C Compiler 5.1  -  -       OS/2 1.0対応。廉価版として Quick C 2.0 (1989) C Compiler 6.0  -  -  600  1989年  Windowsプログラミングには別途SDKが必要。 C/C++ Compiler 7.0  -  -  700  1992年  MFCが付属した最初のバージョン。 Visual C++ 1.0  1.0  1.0  800  1993年  32ビット対応。 Visual C++ 1.5  1.5  1.5  800  1993年   Visual C++ 1.51  1.51  1.51  800     Visual C++ 2.0/4.0Pro日本語版に付属。 Visual C++ 1.52c  1.52  1.52c  800     英語版のみ。MS-DOS/Win16バイナリ（プログラム）を作成できる最終バージョン。 Visual C++ 2.0  2.0  2.0  900  1995年  Windows NT対応。32ビット専用。 Visual C++ 2.1  2.1  2.1  900      Visual C++ 2.2  2.2  2.2  900      Visual C++ 4.0  4.0  4.0  1000  1996年  Windows 95対応 Visual C++ 4.1  4.1  4.1  1010  1996年  Win32sで動作するWin32バイナリ（プログラム）を作成できる最後のバージョン。 Visual C++ 4.2  4.2  4.2  1020  1996年   Visual C++ 5.0  5.0  5.0  1100  1997年   Visual C++ 6.0  6.0  6.0  1200  1998年     2002  7.0  1300  2002年  マネージ拡張C++のサポート追加。 Visual C++.NET 2003  2003  7.1  1310  2003年  Windows 95で動作するWin32バイナリ（プログラム）を作成できる最後のバージョン。この製品までは既定の文字コード設定が「マルチバイト文字列を使用する」になっている。 Visual C++ 2005  2005  8.0  1400  2005年  Windows 98/Me/NT4で動作するWin32バイナリ（プログラム）を作成できる最後のバージョン。この製品以降は既定で「Unicode文字列を使用する」に変更されている。C++/CLIのサポート追加。上位エディションでコード分析/analyzeが使えるようになったVisual C++ 2003 ～ 2015 の新機能 | Microsoft Docs。 Visual C++ 2008  2008  9.0  1500  2007年  Windows 2000で動作するWin32バイナリ（プログラム）を作成できる最後のバージョン。<br/ >IA-64で動作するMFCを使うWin64バイナリ（プログラム）を作成できる最後のバージョン。 Visual C++ 2010  2010  10.0  1600  2010年 C++0xへ部分的に対応。IA-64で動作するWin64バイナリ（プログラム）を作成できる最後のバージョン。なお、Visual C++ 2010ではC++/CLI言語のインテリセンス機能が動作しない。  Visual C++ 2012  2012  11.0  1700  2012年 （C++0xでなく）C++11へ部分的に対応開始。ただし__cplusplusの定義内容は199711L（C++98を表す）のまま。Windowsストアアプリ対応（WinRT、C++/CX）。C++/CLI言語のインテリセンスの復活。コード生成に関して SSE2 までの拡張命令の使用（/arch:SSE2）がデフォルトになったコンパイラの判断によって32bit版アプリケーションでも SSE2 命令が使われる可能性がある。Breaking Changes in Visual C++ | Microsoft Docs浮動小数点の移行に関する問題 | Microsoft Docs。DirectXグラフィックス診断機能（Graphics Diagnostics）の追加。下位エディションでもコード分析が使えるようになった。 Visual C++ 2013  2013  12.0  1800  2013年  C++11対応の強化。C99の大半に対応。MFC/ATLのマルチバイト版はバンドルされなくなったUnicode とマルチバイト文字セット (MBCS: Multibyte Character Set) のサポート。マネージ拡張C++のコンパイルオプション (/clr:OldSyntax) を使用できる最後のバージョン。 Visual C++ 2015  2015  14.0  1900  2015年  C++11/C++14対応の強化。リファクタリング機能の実験的サポートVisual Studio 2015 における Visual C++ の新機能。 Visual C++ 2017  2017  14.1  1910Visual Studioのアップデートに伴い、_MSC_VERの最下位の桁も更新されるようになっている。  2017年  C++11/C++14/C++17対応の強化。CMake対応の追加などVisual Studio 2017 (バージョン 15.0) リリース ノート。Windows XPで動作するバイナリを作成できる最後のバージョンVisual Studio 2019 プレビューでの非推奨の C++ 機能 | Microsoft Docs。 Visual C++ 2019  2019  14.2  1920  2019年  C++20対応の強化。OpenMP 4.0 SIMDベクトル化の実験的サポートSIMD Extension to C++ OpenMP in Visual Studio | C++ Team Blog/openmp (Enable OpenMP Support) | Microsoft Docs。C++ IntelliCodeが付属Visual Studio 2019 リリース ノート | Microsoft Docs。Visual Studio 2017で実験的に追加されたNew, experimental code analysis features in Visual Studio 2017 15.8 Preview 3 | C++ Team Blogエディター内C++コード分析の正式サポートIn-editor code analysis in Visual Studio 2019 Preview 2 | C++ Team Blog。 Visual C++ 2022  2022  14.3  1930  2021年  C++20/対応の強化。C++23の部分的対応。https://learn.microsoft.com/ja-jp/cpp/overview/what-s-new-for-visual-cpp-in-visual-studio?view=msvc-170]。

 ランタイムライブラリの互換性 
Visual C++ (以下VC) のCRT (C Runtime) ライブラリは、コンパイルオプションによって静的リンクあるいは動的リンクを選択することができる/MD, -MT, -LD (Use Run-Time Library) | Microsoft Docs。DLLおよびEXEにVCランタイムを動的リンクする場合、DLL/EXE自体のファイルサイズを削減できるなどのメリットがあるが、アプリケーションの実行にはVCバージョンごとのランタイムライブラリモジュールが実行環境に必要となる（例えばVC2010の場合は msvcr100.dll や msvcp100.dll など）。MFC/CLR/OpenMP/C++ AMPを利用して作成されたDLL/EXEの場合はさらにそれぞれのランタイムライブラリが必要となる。エンドユーザー環境向けにVCランタイムライブラリの再頒布可能 (redistributable) パッケージがインストーラー形式で提供されているが、このインストーラーにはデバッグバージョンのライブラリは含まれない。Windowsのバージョンによっては、特定のバージョンのVCランタイムのサブセットがシステムコンポーネントとしてプリインストールされている。

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

VC2015ではUniversal CRTが導入され、またVC2017およびVC2019ではランタイムに破壊的変更がなくVC2015との互換性があるため、一定の条件が満たされればDLL境界を越えてCRTオブジェクトの寿命を管理することができるC++ Binary Compatibility between Visual Studio 2015 and Visual Studio 2019 | Microsoft DocsVisual C++ change history 2003 - 2015 | Microsoft DocsCRT ライブラリの機能 | Microsoft DocsUniversal CRT へのコードのアップグレード | Microsoft Docs。Windows 10の場合、Universal CRTはシステムコンポーネントとして標準インストールされているが、それよりも前のバージョンのWindowsではWindows Updateや再頒布可能パッケージによるシステムディレクトリへのインストール（集中配置）、あるいはアプリケーションごとのローカル配置などの手段を利用する必要があるVisual C++ 2015 以降のバージョンの再頒布可能パッケージにおけるインストールの前提条件 – Visual Studio サポート チーム blogVisual C++ 2015 アプリケーションでの CRT ローカル配置について – Visual Studio サポート チーム blogIntroducing the Universal CRT | C++ Team BlogUniversal CRT deployment | Microsoft Docs最新のサポートされる Visual C++ のダウンロードWindows での汎用の C ランタイムの更新プログラム。

 脚注 

 関連項目 
 Microsoft Visual Studio
 Microsoft Foundation Class
 Active Template Library

 外部リンク 
 Visual C++ のドキュメント | Microsoft Docs
 サポートされている最新の Visual C++ 再頒布可能パッケージのダウンロード | Microsoft Docs
 C および C++ コーディング ツール | Visual Studio
 MSDN Code Recipe：サンプルコード集

Category:統合開発環境
Category:コンパイラ
C++
Category:C++
Category:フリーウェア
Category:1983年のソフトウェア