13

今週初め、Kenny Kerrは CppCon 2016 で C++/WinRT を発表しました1これは、 Modernに基づく、Windows ランタイムの標準 C++ プロジェクションです。

私が理解している限り、C++/CXコンパイラ/プリプロセッサ/コード ジェネレーターは標準 C++ コードには触れていません。また、C++/WinRT が標準 C++ ライブラリであるため、C++/CX と C++/WinRT の両方ができるというのは私の素朴な解釈です。同じプロジェクトで使用できます。

質問:

  • まず最初に: 私の素朴な解釈は正しいですか?
  • その場合、C++/CX と C++/WinRT を同じコンパイル ユニットで使用できますか?
  • C++/CX と C++/WinRT を同じコンパイル ユニットに配置できない場合、それらをどの程度の粒度で混在させることができますか?
  • C++/WinRT は、同じプロジェクトで C++/CX で実装された型を使用できますか? (C++/WinRT コンパイラは .winmd メタデータからヘッダーを生成する必要があるため、(プレ) コンパイラ出力に依存するため、これは難しいと思います。)

重要な場合は、これらの質問への回答により、C++/CX プロジェクトを将来に移行する方法について今すぐ決定を下すことができます。


1 Windows ランタイム用の標準 C++ の採用 (YouTube) .

4

2 に答える 2

15

簡単に言うと、C++/CX とC++/WinRTは同じプロジェクト内で使用できます。

C++/CX コンパイラは、Winmd 型をルート名前空間に挿入します。C++/WinRT は、独自のルート winrt 名前空間内にすべてをラップして、C++/CX との相互運用性に対応し、他のライブラリとの C++ コンパイラのあいまいなエラーを回避します。したがって、次の C++/CX コード:

using namespace Windows::Foundation;
using namespace Windows::Networking;

Uri ^ uri = ref new Uri(L"https://moderncpp.com/");
HostName ^ name = ref new HostName(L"moderncpp.com");

次のように C++/WinRT で書き直すことができます。

using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Networking;

Uri uri(L"https://moderncpp.com/");
HostName name(L"moderncpp.com");

または、/ZW を使用してコンパイルしている場合は、次のように書き換えることができます (エラー C2872: 'Windows': ambiguous symbol を回避するため):

using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Networking;

Uri uri(L"https://moderncpp.com/");
HostName name(L"moderncpp.com");

同じソース ファイルで C++/CX と C++/WinRT の両方を組み合わせるもう 1 つの方法は、次のように両方にルート名前空間を使用することです。

namespace cx
{
    using namespace Windows::Foundation;
    using namespace Windows::Networking;
}

namespace winrt
{
    using namespace Windows::Foundation;
    using namespace Windows::Networking;
}

void Sample()
{
    cx::Uri uri(L"https://moderncpp.com/");
    winrt::HostName name(L"moderncpp.com");
}

結局のところ、C++/WinRT は、該当する C++ プロジェクトに含めることができる単なる標準 C++ ライブラリです。ただし、C++/CX と C++/WinRT では、メタデータの扱いが大きく異なります。C++/CX はメタデータを直接使用および生成しますが、C++/WinRT は標準 C++ によって制約されているため、そのギャップを埋めるためにスタンドアロン ツール (cppwinrt.exe) が必要です。

于 2016-09-27T21:31:02.483 に答える