CppUTestでBoostやSTLを利用する方法

主に自分用のメモとして。

CppUTestを、STLやBoost等、New演算子をオーバーライドして実装しているライブラリと併用するとき発生する問題と、その対策についてです。

経緯としては、こんな感じです。

CppUTestを使ったTDDを行なっている最中、boost::shared_ptrを使おうとしたところ、エラーが出てコンパイルが通らなくなりました。

ヘッダファイルをインクルードしただけで発生していたので、構文ミスでもない模様。

調べたところ、以下のスレッドにたどり着きました。

詳しい説明は以下。

Conflicts with operator new macros (STL!)

It is common for the memory leak detection macros to conflict with an overloaded operator new or with STL. This is because the macro replaces the call to operator new to a call to operator new with __FILE__, and __LINE__. If you overload operator new, it will replace your overloaded definition resulting in a compiler error. This is common when using Standard C++ library (STL).

CppUTestでは、標準でメモリリーク検出機能が動作するようになっているのですが、この機能を、new演算子をマクロとして再定義する形で実装しているようです。STLやBoostのライブラリでは、 new演算子をオーバーライドしているため、このマクロがコンフリクトしてしまうらしい。

解決方法としては、このマクロが定義される前に、対象となるヘッダをインクルードすること。

例えば、まず以下の様な、利用したいヘッダを読み込むヘッダを作り、

  • tests/PreIncludeFiles.h
#ifndef D_PRE_INCLUDE_FILES_H
#define D_PRE_INCLUDE_FILES_H

#include "boost/shared_ptr.hpp"

#endif

Makefileに、Includeするよう記述します。

CPPUTEST_CXXFLAGS += -include tests/PreIncludeFiles.h

gccのオプションは、CPPUTEST_CXXFLAGSCPPUTEST_WARNINGFLAGSCPPUTESTの標準オプション の順番で読まれるようなので、これで回避できる模様。

-include オプションなんて初めて知った。

ちなみに、メモリリーク機能を読み込む前に展開しているので、読み込んだ外部ライブラリのメモリリーク検出はできないようです。