Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじめに

ネット上で入手できる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")を使っているが、ここも書き換えられるだろうか。
exli3141
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away