20989


はじめまして．質問を見ていただいてありがとうございます．

私は最近，MSVC12.0（以降VC12）からMSVC14.0（以降VC14）への移行を始めた者です．

  * ## 症状と原因

VC12では動作できていたオープンソースのライブラリ（とあるカメラ制御APIです）がVC14に移行した途端，ヘッダファイルから大量のエラーをくらいました．

VC12とVC14での違いを調べていたところ，どうやらプラットフォームを確認するヘッダ内の挙動が変わっているようでした．

私が使っているそのライブラリは，

[code]

    #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
    
[/code]

とプラットフォームごとに別々な定義をしています．  
VC12では，WIN32が定義されていましたので，Windowsのための定義を通りました．  
しかし，VC14ではWIN32が定義されておらず，代わりに_WIN32が定義されていました．  
ちなみに，VC12にも_WIN32は定義されているようでした．

  * ## 質問

このエラーは，「VC14でWIN32から_WIN32に完全に移行したけれど，使っているライブラリがそれに対応していない」ことが原因だと考えているのですが，正しいでしょうか．  
また，WIN32と_WIN32の違いや，_WIN32になった背景などがわかる方がいれば教えていただきたいです．

長くなってしまいましたが，よろしくお願いします．


CC BY-SA 3.0
2016-01-17T02:21:24.663
20987
2016-01-21T13:57:26.917
2016-01-18T10:51:42.000
49
14032
question
c++ visual-studio
C++ MSVC14.0 での WIN32マクロについて


[定義済みマクロ](https://msdn.microsoft.com/ja-
jp/library/b0084kay.aspx)に関していえばドキュメントに残っている範囲では少なくともVC7.1（Visual C++.NET
2003）以降は`_WIN32`しか記載されていません。つまり`WIN32`はundocumentedな動作に依存していたということです。

これに関して、[C識別子](https://msdn.microsoft.com/en-
us/library/e7f8y25b.aspx)および[C++識別子](https://msdn.microsoft.com/ja-
jp/library/565w213d.aspx)は

> 識別子の先頭での 2 つの連続するアンダースコア文字 (__)、または 1 つのアンダースコア文字と 1 つの大文字の使用は、すべてのスコープで C++
> の実装のために予約されています。

という仕様に従うべく、`WIN32`のようにアンダースコアで始まらない識別子はなるべく使わないように順次変更されているものと思われます。


CC BY-SA 3.0
2016-01-17T02:59:00.627
20989
2016-01-17T02:59:00.627
4236
20987
answer


必要なら、自身で`WIN32`を定義してしまえば良いと思います。もちろん、ソースコードの側の改変が可能なら`_WIN32`に変更するのが便利です。

理由は以下の通りです。MSVC 12.0でもMSVC
14.0でも、`WIN32`はコンパイラで最初から定義されているものではありません。ただ、いずれのバージョンでも、Visual
Studioでプロジェクトを新規作成すると、初期状態ではプロジェクトのプロパティで`WIN32`が（`_DEBUG`や`NDEBUG`などとともに）定義されるようになっています。

そのため、MSVC 12.0でビルドしていたときも、どこかしら（`Makefile`やVisual
Studioプロジェクトなど）で`WIN32`が定義されていたはずなのです。MSVC
14.0に移行した際、その設定が欠落してしまったのではないかと思います。


CC BY-SA 3.0
2016-01-17T14:46:21.027
21010
2016-01-21T13:57:26.917
2016-01-21T13:57:26.917
8616
8616
20987
answer