今日、先程あった出来事なのですが、手元のLinux環境で動いているコードをWindows上でビルドしようとしたら突如大量のエラーが発生。

C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(286,1): error C2059: syntax error: ')' [D:\a\kaprino\kaprino\build\kprc.vcxproj]
C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(346,19): error C2589: '(': illegal token on right side of '::' [D:\a\kaprino\kaprino\build\kprc.vcxproj]
C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(346,1): error C2062: type 'unknown-type' unexpected [D:\a\kaprino\kaprino\build\kprc.vcxproj]
C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(346,1): error C2059: syntax error: ')' [D:\a\kaprino\kaprino\build\kprc.vcxproj]
C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(579,20): error C2589: '(': illegal token on right side of '::' [D:\a\kaprino\kaprino\build\kprc.vcxproj]
C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(579,1): error C2062: type 'unknown-type' unexpected [D:\a\kaprino\kaprino\build\kprc.vcxproj]
C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(579,1): error C2059: syntax error: ')' [D:\a\kaprino\kaprino\build\kprc.vcxproj]
....

エラーが出ている部分を確認すると全てstd::minstd::maxでした。

なぜWindows環境でstd::minstd::maxというポピュラーな関数がエラーを吐いたんでしょう…?

結論 見出しへのリンク

#include<windows.h>をしていたのが原因でした。(Linux環境では#ifdefではじいていたので気付かなかった)

windows.hが内部でincludeしているwindef.h

#ifndef NOMINMAX
#ifndef max
#define max(a,b) ((a)>(b)?(a):(b))
#endif
#ifndef min
#define min(a,b) ((a)<(b)?(a):(b))
#endif
#endif

上記のようにmaxマクロとminマクロが定義されています。
それがstd::maxstd::minとconflictしてエラーが発生していました。そりゃ気づきませんわ

上記のコードから分かるように#define NOMINMAXすることでwindows.hの使用を諦めることなくエラーを回避することが出来ます。

参考 見出しへのリンク

windef.h
Why is std::min failing when windows.h is included? (Stackover flow)