太郎日記’79J

「やったろうやないの。」な太郎のblog
技術ネタはタロタローグに任せて、こっちはニュースメインで。
<< September 2018 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>
 
RECOMMEND
MySQLによるタフなサイトの作り方
MySQLによるタフなサイトの作り方 (JUGEMレビュー »)
佐藤 真人,桑野 章弘,岡田 達典,大黒 圭祐
MySQLだけでなく、DBサーバやアプリの設計など、あらゆる手段を使ってタフなサイトを作る本である
最新記事
あわせて読みたい
あわせて読みたい
なかのひと
ClusterMaps
CM by JUGEM
スポンサーサイト

一定期間更新がないため広告を表示しています

- | 個別記事 | - | -
CppUnitの使えなさが、CPPUNIT_TEST_SUITE_REGISTRATIONで露呈した。

最近、CppUnitなるものを使ってテストをしている。
JUnitと違ってテキストのUIしか使えんし、非常に不便だ。
何か、実際にはGUI使えるっぽいが、諸事情で今は無理なんだが。

今回は妙なエラーに阻まれてビルド失敗しまくった話。
ヘッダファイルのクラス定義の下に、

CPPUNIT_TEST_SUITE_REGISTRATION(テストクラス名);
と書いてテスト・スイートを登録するんだが、
どうもテストクラスが2つあるとエラー出る。
曰く、
'autoRegisterRegistry__35' : 再定義されています。異なる基本型です。
こんなエラー。
要するに、「同じ関数を異なる基本型で複数定義してるぞ」ってことだ。
ちなみに、この「autoRegisterRegistry__35」なる関数は、
先ほどの「CPPUNIT_TEST_SUITE_REGISTRATION(テストクラス名);」が展開された結果できる関数だ。

なぜだ!?

と思って調べたら、どうもこのマクロのある行数で、関数名を決めてるっぽい。
まず、HelperMacros.hにこのマクロの宣言があるが、

#define CPPUNIT_TEST_SUITE_REGISTRATION( ATestFixtureType )      ¥
  static CPPUNIT_NS::AutoRegisterSuite< ATestFixtureType >       ¥
             CPPUNIT_MAKE_UNIQUE_NAME(autoRegisterRegistry__ )
このように、他のマクロを呼んでいる。
CPPUNIT_MAKE_UNIQUE_NAMEと言う、
いかにも、「ユニークな名前の関数を作りますよ」と言ったマクロだ。
こいつは、「Portability.h」に定義されている。
#define CPPUNIT_MAKE_UNIQUE_NAME( prefix ) CPPUNIT_JOIN( prefix, __LINE__ )
__LINE__は、行番号だ。
つまり、このマクロは名前とは裏腹に、
渡された接頭辞に、行番号を付けて返すだけだった。
つまり、違うテストクラスでも、
同じ行番号で「CPPUNIT_TEST_SUITE_REGISTRATION」マクロを使うと、関数名がかぶってエラーになるのだ。
確かに俺が試したケースでも行番号は同じで、35行目にCPPUNIT_TEST_SUITE_REGISTRATIONを書いてた。

仕方ないので、片方のテストクラスのマクロの上に、改行を入れて対処した。
そしてビルド成功。

誰だこのマクロ作った奴。

このバカ!

スポンサーサイト
- | 個別記事 | - | -
ドミノ・ピザでも食べながら、コメントをどうぞ。
コメントする









 
トラックバック
この記事のトラックバックURL(記事と無関係なトラックバックは削除される可能性があります)
※記事が投稿されてから30分の間、トラックバックを行うことが出来ません。
http://tarotaro.jugem.cc/trackback/1590
 

Copyright (C) 2004 paperboy&co. All Rights Reserved.

Powered by "JUGEM"