今日、先程あった出来事なのですが、手元の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)