今日、先程あった出来事なのですが、手元の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::minとstd::maxでした。
なぜWindows環境でstd::minとstd::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::maxとstd::minとconflictしてエラーが発生していました。そりゃ気づきませんわ
上記のコードから分かるように#define NOMINMAXすることでwindows.hの使用を諦めることなくエラーを回避することが出来ます。
参考 見出しへのリンク
windef.h
Why is std::min failing when windows.h is included? (Stackover flow)