質問: はじめまして.質問を見ていただいてありがとうございます. 私は最近,MSVC12.0(以降VC12)からMSVC14.0(以降VC14)への移行を始めた者です. * 症状と原因 ----- VC12では動作できていたオープンソースのライブラリ(とあるカメラ制御APIです)がVC14に移行した途端,ヘッダファイルから大量のエラーをくらいました. VC12とVC14での違いを調べていたところ,どうやらプラットフォームを確認するヘッダ内の挙動が変わっているようでした. 私が使っているそのライブラリは, ``` #if defined(WIN32) || defined(WIN64) // Windows 32-bit and 64-bit // Some def. here #elif defined(MAC_OSX) // Mac OSX #else // Linux and all others // Using GCC 4 where hiding attributes is possible // Some def. here #endif ``` とプラットフォームごとに別々な定義をしています. VC12では,WIN32が定義されていましたので,Windowsのための定義を通りました. しかし,VC14ではWIN32が定義されておらず,代わりに_WIN32が定義されていました. ちなみに,VC12にも_WIN32は定義されているようでした. * 質問 -- このエラーは,「VC14でWIN32から_WIN32に完全に移行したけれど,使っているライブラリがそれに対応していない」ことが原因だと考えているのですが,正しいでしょうか. また,WIN32と_WIN32の違いや,_WIN32になった背景などがわかる方がいれば教えていただきたいです. 長くなってしまいましたが,よろしくお願いします.
回答: 定義済みマクロに関していえばドキュメントに残っている範囲では少なくともVC7.1(Visual C++.NET 2003)以降は`_WIN32`しか記載されていません。つまり`WIN32`はundocumentedな動作に依存していたということです。 これに関して、C識別子およびC++識別子は > > 識別子の先頭での 2 つの連続するアンダースコア文字 (__)、または 1 つのアンダースコア文字と 1 つの大文字の使用は、すべてのスコープで C++ の実装のために予約されています。 > > > という仕様に従うべく、`WIN32`のようにアンダースコアで始まらない識別子はなるべく使わないように順次変更されているものと思われます。