2012/08/20

stlをincludeしたら別ファイルでxdebugやxlocaleで大量のエラーが出た

ちょっとこまったのでメモ。


■症状
A.hをいじったら、何もいじってない別のB.cppのコンパイルエラーが大量に出た。
(WindowsXP, VisualStudio2008, デバックビルドのみ)

<A.h>
#include

<B.cpp>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "A.h"


<エラー>
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : error C2365: 'operator new' : 再定義; 以前の定義は '関数' でした。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : error C2491: 'new' : dllimport データ の定義は許されません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : error C2078: 初期化子の数が多すぎます。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : error C2440: '初期化中' : 'int' から 'void *' に変換できません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : error C2143: 構文エラー : ';' が '(' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : error C2226: 構文エラー : 'size_t' 型指定子の前あるいは内部で構文エラーが発生しました。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(33) : error C2059: 構文エラー : ')'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(36) : error C2365: 'operator new' : 再定義; 以前の定義は '関数' でした。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(36) : error C2491: 'new' : dllimport データ の定義は許されません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(36) : error C2078: 初期化子の数が多すぎます。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(36) : error C2440: '初期化中' : 'int' から 'void *' に変換できません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(36) : error C2143: 構文エラー : ';' が '[' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(36) : error C3409: 空の属性ブロックは認められません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(36) : error C2226: 構文エラー : 'size_t' 型指定子の前あるいは内部で構文エラーが発生しました。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(143) : error C2059: 構文エラー : '文字列'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(144) : error C2091: 関数は関数を返せません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(144) : error C2802: 静的なメンバ 'operator new' に仮引数リストがありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(144) : error C2333: 'std::locale::facet::operator new' : 関数宣言のエラーです。関数の本体は無視されます
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(149) : error C2059: 構文エラー : '文字列'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(151) : error C2091: 関数は関数を返せません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(151) : error C2556: 'void *(__cdecl *std::locale::facet::operator new(void))(size_t,const std::_DebugHeapTag_t &,char *,int)' : オーバーロード関数は、'void *(__cdecl *std::locale::facet::operator new(void))(size_t)' と戻り値の型のみが異なります。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(152) : error C2059: 構文エラー : 'return'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(152) : error C2238: ';' の前に無効なトークンがあります。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(155) : error C2628: 'std::locale::facet' の後に 'void' を続けて記述できません(セミコロン ';' で区切ってあるか確認してください)。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(157) : error C2487: 'delete' : dll インターフェイス クラスのメンバを dll インターフェイスと共に宣言するのは無効です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(157) : error C2817: 'operator delete' の戻り値の型は 'void' 型でなければなりません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(157) : error C2333: 'std::locale::operator delete' : 関数宣言のエラーです。関数の本体は無視されます
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(162) : error C2487: 'delete' : dll インターフェイス クラスのメンバを dll インターフェイスと共に宣言するのは無効です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(169) : error C2523: 'std::locale::~facet' : デストラクタ が、別の名前で宣言されています。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(170) : error C2487: '{dtor}' : dll インターフェイス クラスのメンバを dll インターフェイスと共に宣言するのは無効です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(174) : error C2590: 'facet' : ベース/メンバ初期化子リストを持つことができるのはコンストラクタだけです。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(174) : error C2487: 'std::locale::{ctor}' : dll インターフェイス クラスのメンバを dll インターフェイスと共に宣言するのは無効です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(186) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(187) : error C2143: 構文エラー : ';' が '&' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(187) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(187) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(187) : error C2143: 構文エラー : ',' が '&' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(187) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(119) : error C2327: 'std::locale::_Refs' : 型名、スタティック、または列挙子ではありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(119) : error C2065: '_Refs' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(120) : error C2327: 'std::locale::_Refs' : 型名、スタティック、または列挙子ではありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(120) : error C2065: '_Refs' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(127) : error C2327: 'std::locale::_Refs' : 型名、スタティック、または列挙子ではありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(127) : error C2065: '_Refs' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(127) : error C2327: 'std::locale::_Refs' : 型名、スタティック、または列挙子ではありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(127) : error C2065: '_Refs' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(128) : error C2327: 'std::locale::_Refs' : 型名、スタティック、または列挙子ではありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(128) : error C2065: '_Refs' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(129) : error C2327: 'std::locale::_Refs' : 型名、スタティック、または列挙子ではありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(129) : error C2065: '_Refs' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(163) : error C2059: 構文エラー : ')'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(197) : error C2504: 'facet' : 定義されていない基本クラスが宣言されています。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(207) : error C2061: 構文エラー : 識別子 'facet'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(222) : error C2061: 構文エラー : 識別子 'facet'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(228) : error C2061: 構文エラー : 識別子 'category'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(231) : error C2061: 構文エラー : 識別子 'category'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(235) : error C2061: 構文エラー : 識別子 'category'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(239) : error C2061: 構文エラー : 識別子 'category'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(241) : error C2143: 構文エラー : ';' が '*' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(241) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(241) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(243) : error C2146: 構文エラー : ';' が、識別子 '_Catmask' の前に必要です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(243) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(243) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(212) : error C2065: 'none' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(213) : error C2614: 'std::_Locimp' : イニシャライズ リスト内のクラス '_Catmask' が基本クラスでもメンバでもありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(213) : error C2614: 'std::_Locimp' : イニシャライズ リスト内のクラス '_Facetvec' が基本クラスでもメンバでもありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(213) : error C2614: 'std::_Locimp' : イニシャライズ リスト内のクラス 'facet' が基本クラスでもメンバでもありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(217) : error C2039: '_Catmask' : 'std::_Locimp' のメンバではありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(218) : error C2614: 'std::_Locimp' : イニシャライズ リスト内のクラス '_Catmask' が基本クラスでもメンバでもありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(218) : error C2614: 'std::_Locimp' : イニシャライズ リスト内のクラス '_Facetvec' が基本クラスでもメンバでもありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(218) : error C2614: 'std::_Locimp' : イニシャライズ リスト内のクラス 'facet' が基本クラスでもメンバでもありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(224) : error C2065: '_Pfacet' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(224) : error C2065: '_Id' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(259) : error C2065: 'facet' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(259) : error C2065: '_Fac' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(259) : error C2275: 'size_t' : この型は演算子として使用できません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(259) : error C2146: 構文エラー : ')' が、識別子 '_Id' の前に必要です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(259) : error C2078: 初期化子の数が多すぎます。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(259) : error C2275: 'size_t' : この型は演算子として使用できません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(260) : error C2059: 構文エラー : ')'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(261) : error C2143: 構文エラー : ';' が '{' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(261) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(286) : error C2270: '()' : メンバでない関数が、メモリ モデル修飾子を伴って宣言されています。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(286) : error C2801: 'std::operator ()' は静的でないメンバでなければなりません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(304) : error C2270: 'combine' : メンバでない関数が、メモリ モデル修飾子を伴って宣言されています。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(307) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(307) : error C2904: 'locale' : 名前は、現在のスコープで、テンプレートに対して使用されています。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(323) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(323) : error C3861: '_Init': 識別子が見つかりませんでした
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(324) : error C2550: 'std::locale' : コンストラクタの初期化子リストはコンストラクタの定義だけに許されます。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(325) : error C2227: '->_Incref' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(325) : error C3861: '_Getgloballocale': 識別子が見つかりませんでした
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(329) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(332) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(332) : error C2143: 構文エラー : ',' が '&' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(333) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(333) : error C2065: '_Right' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(333) : error C2228: '._Ptr' の左側はクラス、構造体、共用体でなければなりません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(334) : error C2550: 'std::locale' : コンストラクタの初期化子リストはコンストラクタの定義だけに許されます。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(335) : error C2227: '->_Incref' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(338) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(338) : error C2143: 構文エラー : ',' が '&' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(340) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(340) : error C2084: 関数 'int std::locale(const int) throw()' は既に本体を持っています。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(340) : error C2061: 構文エラー : 識別子 '_DebugHeapTag_func'
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(340) : error C2612: ベースあるいはメンバの初期化子リストの最後に、'識別子' がついています。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(340) : error C2550: 'std::locale' : コンストラクタの初期化子リストはコンストラクタの定義だけに許されます。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(340) : error C2065: '_Loc' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(340) : error C2228: '._Ptr' の左側はクラス、構造体、共用体でなければなりません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(340) : error C2143: 構文エラー : ';' が ')' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(340) : error C2143: 構文エラー : ';' が ')' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(341) : error C2143: 構文エラー : ';' が '{' の前にありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(343) : error C2065: '_Loc' : 定義されていない識別子です。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(343) : error C2228: '._Ptr' の左側はクラス、構造体、共用体でなければなりません
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(343) : error C2227: '->_Catmask' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(343) : fatal error C1003: プログラム内のエラーが 100 個を超えました。コンパイルは中断されます。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : warning C4229: 旧形式が使用されています : データの修飾子は無視されます。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(36) : warning C4229: 旧形式が使用されています : データの修飾子は無視されます。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(186) : warning C4183: 'facet': 戻り値の型がありません。'int' を返すメンバ関数とみなします。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(326) : warning C4508: 'std::locale' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(330) : warning C4508: 'std::locale' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。
12>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(336) : warning C4508: 'std::locale' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。


■原因
デバックビルドではstl系をincludeするとxdebugもincludeされるらしい
このxdebugでnewをdefineしていてメモリーリーク検出用の
#define new DEBUG_NEWがおかしくなる


■対処
B.cppで#define new DEBUG_NEWより前でstl系をincludeする

<B.cpp>

#include "A.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

まぁ#define new DEBUG_NEWは下でやりましょって話


■参考




0 件のコメント: