今回の裏テーマ、「Boost.AtomicをVisual C++ 2005で使用する」です。
Visual C++ 2005でそこそこ新しいWindows SDKを併用すると、<windows.h>と<intrin.h>で衝突して使えない問題の解決法です。
このように、#defineでいい感じの宣言になるように細工してからincludeします、めでたしめでたし。
#include <windows.h> #define _interlockedbittestandset(a, b) _interlockedbittestandset(volatile long*, long) #define _interlockedbittestandreset(a, b) _interlockedbittestandreset(volatile long*, long) #define _interlockedbittestandset64(a, b) _interlockedbittestandset(volatile long long*, long long) #define _interlockedbittestandreset64(a, b) _interlockedbittestandreset(volatile long long*, long long) #include <intrin.h> #undef _interlockedbittestandset #undef _interlockedbittestandreset #undef _interlockedbittestandset64 #undef _interlockedbittestandreset64 #incldue <boost/atomic.hpp> |
今まで<intrin.h>をインクルードしない(必要な関数は個別に宣言する)ようにしていました。ところが、Boost.Atomicが内部で<intrin.h>をインクルードするため、そういうわけにはいかなくなってしまったのです。そのため、こんな回避策を考えました。
もうこんなエラーとはおさらばです。
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\INCLUDE\intrin.h(944) : error C2733: オーバーロードされた関数 '_interlockedbittestandset' の C リンケージの 2 回以上の宣言は許されません。 C:\Program Files (x86)\Microsoft Visual Studio 8\VC\INCLUDE\intrin.h(944) : '_interlockedbittestandset' の宣言を確認してください。 C:\Program Files (x86)\Microsoft Visual Studio 8\VC\INCLUDE\intrin.h(945) : error C2733: オーバーロードされた関数 '_interlockedbittestandreset' の C リンケージ の 2 回以上の宣言は許されません。 C:\Program Files (x86)\Microsoft Visual Studio 8\VC\INCLUDE\intrin.h(945) : '_interlockedbittestandreset' の宣言を確認してください。
スポンサード リンク |