C++ filesystem ヘッダの課題

Visual Studio 2019 のバージョン 16.3 以降で、 filesystem ヘッダの部分が変わりました。
従来は experimental だったのが、正式版となったような感じです。
何もしないでコンパイルが通る状況では無くなったので修正を施します。

バージョン判定

Visual Studio 2019 の途中のバージョンからの変更となるため、ここを識別する必要があります。
Qiita のほうに丁寧にまとめてくれている人が居たのでこれを参考にさせてもらいます。

_MSC_VERと_MSC_FULL_VERをまとめる - Qiita
# 情報提供 情報提供お待ちしています。編集リクエストなりコメントでいただければなるべく早く反映します。 # 追記: cpprefjp, dev.toにも同じ表を記載 - [処理系 - cpprefjp C++日本語リファレンス...

これを見ると、 _MSC_VER が 1923 以降である場合には、従来ヘッダでエラーとなってしまうと考えると良さそうです。

対策: C++17 準拠にする

対策として experimental なヘッダは使わずに、標準のものに格上げしてしまうという手があります。従来のコンパイル環境を考慮しなくて良いならこの方法が素直だと思います。

#include <filesystem>
using namespace std::filesystem;

注意点として、上記のようなコード修正だけでは不十分で、プロジェクトの設定を変更する必要もありました。題名にもあるように、”C++17″ を使うようにしてコンパイルされるように設定が必要です。これを設定しないと、新しいヘッダファイルの中身が有効化されないようです。

対策:従来ヘッダを使う

古いコンパイル環境も考慮しなくてはいけない、となると新しいものを使うのは厳しいです。
古いヘッダファイルを読み込んでもエラーとならないようにする方法を考えます。

旧ヘッダファイルを使う場合には、 _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING マクロを定義すると使用可能となるようです。これを冒頭に述べたバージョン判定と組み合わせて、新しい環境の時に定義されるようにします。

#if _MSC_VER > 1922 && !defined(_SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING)
#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
#endif
#include <experimental/filesystem>

using namespace std::experimental::filesystem;

まとめ

随分と前に噂では聞いていた filesystem ヘッダの変更を(今更)対応しました。というのも GitHub に公開している DirectX12 のサンプルプログラムに対してのPRが発端でした。自分の Visual Studio 2019 最新版でコンパイルしてみたら、この部分でエラーが出まして。警告でなく、ビルドエラーです。 strcpy_s などの関数の時にはワーニングだったのに、ひどい仕打ちです。

プログラミング
すらりんをフォローする
すらりん日記

コメント

タイトルとURLをコピーしました