Windows10+Visual Studio 2017において、C++/CXでコンソールにはろわする方法

  • 1
    いいね
  • 0
    コメント

はじめに

ネット上で入手できるC++/CXの記述はだいたいWin8の環境で使用されるもので、Win10用、つまりはUWP環境用のものがなかった。せっかくVS2017が公開されたのだから、それに対応した形で"あえて"コンソールHello Worldの出し方を記述しておく。

導入

Microsoftのサイトから「Visual Studio 2017 Community edition」のインストーラをダウンロードする。個人の学習用なら無償でおーけーである。
それを実行するとローカル上でインストーラそのものがインストールされるので、そこからC++に絡むものをだいたい入手する。

図1:インストール詳細
vs2017いんすこ1.png

上記の枠で囲った部分にチェックを入れると、右枠に「ユニバーサルWindowsプラットフォーム開発」の項目が出るので、ここの中から「C++ ユニバーサル Windows プラットフォームツール」にチェックを入れておく。

とりあえずインストールにはかなりのストレージ容量が必要になるので空き容量を確認しておくこと。

設定

インストールが完了し無事Visual Studio 2017を立ち上げられたら、新しいプロジェクトからVisual C++内にある空のプロジェクトを選択する。

※プライバシー保護のためプロジェクトが入るフォルダを隠しています。
※記事のために試験的にproject1を作成済みです。
vs2017新規.png

ここでは仮に「helloworld-cxx」というプロジェクト名を入れて作ることにする。
そうすると空のプロジェクトをひとつ含んだソリューションが作成されるが、このままプロジェクトのプロパティを選んでもC/C++の項目が出ないので、ソースファイルにcppファイルを追加しておく。
cppファイルを追加したら、プロジェクトのプロパティで以下の設定をしておく。

  1. 構成プロパティの全般タブにある「文字セット」「Unicode文字セットを使用する」
  2. C/C++の全般タブにある「Windowsランタイム拡張機能の使用」「はい(/ZW)」
  3. C/C++のコード生成タブにある「最小リビルドを有効にする」「いいえ(/gm-)」

ここまでの設定はWindows 8でC++/CXを使用する場合と一緒なので画像の説明は省略。
あとはwindows.winmdとplatform.winmdのファイル先のある場所を「C/C++の全般タブにある追加の#usingディレクトリ」に入れればいいのだが、Windows10環境だとファイルの場所が異なる。
仮に64bit環境でVisual StudioをProgram Filesフォルダ以下に入れている場合、

  • windows.winmdは"C:\Program Files (x86)\Windows Kits\10\UnionMetadata"に、
  • platform.winmdは"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\lib\x86\store\references"に、

それぞれ存在する。
32bit環境なら(x86)がないはずなのでその以下のフォルダを探ればよいだろう。

あとは「リンカーの詳細設定タブにあるエントリーポイントにmainCRTStartupと入力」して設定終了である。

Hello World!する

とりあえず以下のコードを作成したcppファイルに打ち込んで保存してビルドすればコンソールに表示されるはず。

Source.cpp
#include <iostream>

int main(Platform::Array<Platform::String^>^ args)
{
    Platform::Details::Console::WriteLine(L"Hello world!");
    system("pause");
    return (0);
}

※実行結果
実行結果コンソール.png

ポイント

  1. C++/CXでは、main関数の引数に"Platform::Array<Platform::String^>^ args"を指定しないとwarningが出る。これを入力すると今度はエントリーポイントがないと怒られるので、リンカーの設定を埋める必要がある。
  2. iostreamのwcoutでもコンソールに投げ込めるが、せっかくなのでPlatform::Datail::Consoleを使ったほうがC++/CXらしい。
  3. system("pause")を使っているが、ここも書き換えられるだろうか。