Microsoft Visual C++

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

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

概要

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

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

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

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

Visual C++ 8.0以降は64ビット命令の生成に対応している。付属するコンパイラには、コンパイラが動作する環境と同じネイティブコードを生成するものと、32bit(x86)環境で動作して 64bit (x64またはIA-64) ネイティブコードを出力するもの(クロスコンパイラ)がある。32ビット (x86) 環境上であってもクロスコンパイルすることができる。

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 C++のコンパイラは、C, C++, C++/CLI, C++/CXのソースコードを入力に受け付ける。

C言語規格に関しては、Visual C++ 9.0 (2008) SP1の時点では ANSI C89 (ISO C90, ISO/IEC 9899:1990) 対応[1]であり、C99には対応していない(//で始まるコメントやlong long intなどは言語拡張としてサポートされている)。Visual C++ 2013 では、全てではないが C99 の関数の大半を追加した[2]

C++言語規格に関しては、Visual C++ 9.0 (2008) SP1の時点でC++98 (ISO/IEC 14882:1998) 規格に対応している[3]。 Visual C++ 10.0 (2010) では、auto、decltype、ラムダ式rvalue reference(右辺値参照)、static_assert、nullptr など、C++11規格で追加された機能を一部規格制定に先行して実装した[4]。 Visual C++ 11.0(2012)では、Strongly typed enums、Forward declared enums、Standard-layout and trivial types、Range-based for-loop などのC++11規格を実装した[5]。 Visual C++ 12.0(2013)では、Initializer lists、Alias templates、Delegating constructors、Raw string literals などのC++11規格を追加実装した[6]

主なコンパイラの拡張

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

主なライブラリの拡張

追加のCRT関数
MS-DOS時代に由来するもの、POSIX互換のもの、セキュリティ強化のものなど
コンパイラ組込関数
MMX, SSE, SSE2やその他CPU命令に対応するもの
stdext名前空間
hash_map, hash_setなど
msclr名前空間
C++/CLI, マネージドC++用追加ライブラリ
STL/CLR
C++/CLIでのSTL風のライブラリ
Concurrency Runtime
並列処理ライブラリ
C++ AMP
GPUを使った並列処理ライブラリ(言語拡張を含む)[2]

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

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

マネージ拡張C++

テンプレート:Main マネージ拡張C++ (Managed Extensions for C++マネージドC++Managed C++) は.NET Frameworkに対応したアプリケーションを作成するため、C++を共通言語仕様CLSに準拠させるために独自の拡張を施したものであり、Visual C++ .NET 2002以降に搭載されている。これに対し従来のC++をマネージドC++と区別する際にはアンマネージドC++あるいはネイティブC++と呼ぶ。1つのアプリケーション内にマネージドC++とアンマネージドC++のコードを混在させることも可能であり、従来のC++で書かれたコードを徐々に.NETへ移行したり、あるいは他の.NET言語からC++で作られたライブラリを使用したり、C++コードから.NET Frameworkのクラスライブラリを活用するなどといったことを可能にしている。

C++/CLI

テンプレート:Main C++/CLIは(文法に不明瞭な部分のあった)マネージ拡張C++に代わる、CLSを満たすC++を基にしたプログラミング言語であり、Visual C++ 2005から搭載されている。ただしVisual C++ 2005では(非推奨ではあるが)互換性維持のため従来のマネージ拡張C++のソースコードもコンパイルオプション「/clr:oldSyntax」を指定することでコンパイルできる[4]。なおC++/CLI環境では、従来のC++はアンマネージドではなくネイティブと形容される。

C++/CX

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

その他の機能・特徴

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

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

無料版

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

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日に配布を終了した。MicrosoftがIDE製品の正式版を無料で公開したのは eMbedded Visual Toolsに続いてこれが2作目である。なお、MFCATLは付属していない。また、Windows APIを用いたプログラムを作成するには別途Windows SDKをインストールする必要がある。
Visual C++ 2008 Express Edition
2007年12月18日公開。ATLやMFCが付属しない点はVisual C++ 2005 Express Editionと同じであるが、Windows SDKが標準で同梱されるようになり、Win32アプリケーションの開発に必要なWindows SDKを別途用意する必要がなくなった。
Visual C++ 2010 Express
2010年4月28日公開。Visual C++ ソリューションおよびプロジェクトが XML ベースの MSBuild を使用してビルドするようになり、他の Visual Studio 言語で使用されるビルドシステムと同じになった。
Visual Studio Express 2012 for Windows 8
Visual Studio 2012 Express 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日公開。

ほかにも、バージョン7.1までの Windows SDK (旧Platform SDK)とバージョン7.1までのWindows Driver KitにもVisual C++コンパイラが付属していた。

製品バージョンと内部バージョン

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

Visual C++バージョンの履歴
製品名 製品バージョン 内部バージョン _MSC_VER テンプレート:Nowrap 備考
C Compiler 1.0 - - 100 テンプレート:Nowrap 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 - - Windows 3.1対応。廉価版として 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.52c 1.52 1.52c 800 16ビット向けの最終
Visual C++ 2.0 2.0 2.0 900 1995年
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,Windows NT対応
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年
テンプレート:Nowrap 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のサポート追加。
Visual C++ 2008 2008 9.0 1500 2007年 Windows 2000で動作するWin32バイナリ(プログラム)を作成できる最後のバージョン[22]
IA-64で動作するMFCを使うWin64バイナリ(プログラム)を作成出来る最後のバージョン[23]
Visual C++ 2010 2010 10.0 1600 2010年 C++0xへ部分的に対応。IA-64で動作するWin64バイナリ(プログラム)を作成出来る最後のバージョン[24]。なお、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 命令が使われる可能性がある)[25]
Visual C++ 2013 2013 12.0 1800 2013年 C++11対応の強化。C99の大半に対応。MFC/ATLのマルチバイト版はバンドルされなくなった[26]

脚注

テンプレート:脚注ヘルプ テンプレート:Reflist

関連項目

外部リンク

テンプレート:Asbox
  1. ANSI Conformance
  2. C99 library support in Visual Studio 2013 - Visual C++ Team Blog - Site Home - MSDN Blogs
  3. テンプレート:Cite web
  4. Visual C++ 2010 の新機能
  5. C++11 Features in Visual C++ 11
  6. Support For C++11 Features (Modern C++)
  7. Visual C++ の OpenMP
  8. Visual C++ Editions (2005)
  9. Visual C++ Editions (2008)
  10. Visual C++ Editions (2010)
  11. Visual C++ Tools and Templates in Visual Studio Editions
  12. How to: Iterate Over STL Collection with for each
  13. How to: Declare Override Specifiers in Native Compilations
  14. Compiler Support for Type Traits
  15. SAL注釈
  16. CRTのセキュリティ強化
  17. Safe Libraries: Standard C++ Library
  18. Checked Iterators
  19. Visual C++ 2008 用の MFC Feature Pack
  20. Long Double 型
  21. /arch (x86)
  22. テンプレート:Cite web
  23. テンプレート:Cite web
  24. テンプレート:Cite web
  25. Breaking Changes in Visual C++
  26. Unicode とマルチバイト文字セット (MBCS: Multibyte Character Set) のサポート