今回の裏テーマ、「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' の宣言を確認してください。
スポンサード リンク

この記事のカテゴリ

  • ⇒ Visual C++ 2005で<windows.h>と<intrin.h>を使う
  • ⇒ Visual C++ 2005で<windows.h>と<intrin.h>を使う