読者です 読者をやめる 読者になる 読者になる

S.F. Page

Programming,Music,etc...

Boost.MSM(8) – syntax errorでまだまだはまり中は解決。

Boost C++ Windows

コンパイル時にsyntax errorが出る問題は解決した。

大量のエラーでげっそりしていたのだけれど、丹念にエラーを追っかけていくことにして、まずはエラーコードから見ていくことにした。

H:\libs\boost\include\boost-1_52\boost/utility/value_init.hpp(107) : error C2061: syntax error : identifier 'wrapper_address' (toplevel_window.cpp)

C2061というエラーは予期しない位置で識別子が使われたときに出るエラーである。つまりwrapper_addressという識別子の位置がおかしいとコンパイラは言っている。そしてそれはvalue_init.hpp(107)であるということだ。なのでvalue_init.hppの107行目を見てみると、

    wrapper * wrapper_address() const
    {
      return static_cast<wrapper *>( static_cast<void*>(&x));
    }

  public :

    initialized()
    {
#if BOOST_DETAIL_VALUE_INIT_WORKAROUND
      std::memset(&x, 0, sizeof(x));
#endif
      new (wrapper_address()) wrapper();// 107行目
    }

配置newが使われており、wrapper_addressはwrapper* を返す関数である。見た感じ何も問題なさそうだ。

しかし私はVCのデバッグ支援機能を使っていて、こんな定義を.cppファイルにいつも盲目的に追加している。

#if _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

この定義が先にあると上の配置newは下記のように展開される。


new(_NORMAL_BLOCK, __FILE__, __LINE__)(wrapper_address()) wrapper();// 107行目

なのでsyntax errorになるわけだ。そりゃなりますわな。。解決方法は今のところ、デバッグ支援機能用のコードを挿入する位置をインクルードファイルのあとに入れることで回避している。

これでようやく先に進めるようになった。