2017-01-10 2 views
0

私はCPPUNIT 1.12.1で作業しています。なぜこのマクロは1つのパラメータを持つテンプレートを受け入れ、2つのパラメータを持つテンプレートを拒否しますか?

それは定義されたマクロを持っています

#define CPPUNIT_TEST_SUITE_ADD_TEST(test) \ 
     context.addTest(test) 

#define CPPUNIT_TEST(testMethod)      \ 
    CPPUNIT_TEST_SUITE_ADD_TEST(       \ 
     (new CPPUNIT_NS::TestCaller<TestFixtureType>( \ 
        context.getTestNameFor(#testMethod), \ 
        &TestFixtureType::testMethod,   \ 
        context.makeFixture()))) 

私はテンプレートを使用してすることが可能となり、すべてのテストがvoid関数でなければならない、CppUnitの作品としてテンプレートを使用して、同じテストスイート(に多くのテストを追加したいですさまざまな "パラメータ"を持つ同じvoid関数を呼び出す...)。

これは完璧に動作します:

class MyTestSuite1 : public CPPUNIT_NS::TestFixture 
{ 
    CPPUNIT_TEST_SUITE(MyTestSuite1); 
    CPPUNIT_TEST(doTest<false>); 
    CPPUNIT_TEST(doTest<true>); 
    CPPUNIT_TEST_SUITE_END(); 

    template<bool param> void doTest() { /* test here */ } 
}; 
CPPUNIT_TEST_SUITE_REGISTRATION(MyTestSuite1); 

、これはそうではない:

class MyTestSuite2 : public CPPUNIT_NS::TestFixture 
{ 
    CPPUNIT_TEST_SUITE(MyTestSuite2); 
    CPPUNIT_TEST(doTest<false,false>); 
    CPPUNIT_TEST(doTest<true,false>); 
    CPPUNIT_TEST_SUITE_END(); 

    template<bool param1,bool param2> void doTest() { /* test here */ } 
}; 
CPPUNIT_TEST_SUITE_REGISTRATION(MyTestSuite2); 

コンパイラ(Visual Studioの2015)が報告されます。

1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\hyper_ftac3\test.cpp(20): warning C4002: too many actual parameters for macro 'CPPUNIT_TEST' 1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\hyper_ftac3\test.cpp(21): warning C4002: too many actual parameters for macro 'CPPUNIT_TEST' 1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\hyper_ftac3\test.cpp(20): error C2059: syntax error: ')' 1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\hyper_ftac3\test.cpp(21): error C2059: syntax error: ')' 1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\hyper_ftac3\test.cpp(22): error C2143: syntax error: missing ';' before '}' 1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\hyper_ftac3\test.cpp(22): error C2065: 'namer': undeclared identifier 1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\hyper_ftac3\test.cpp(22): error C2065: 'factory': undeclared identifier 1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\hyper_ftac3\test.cpp(22): error C2059: syntax error: ')' 1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\hyper_ftac3\test.cpp(29): error C2143: syntax error: missing ';' before '{' 1>b:\dev\vobs_diabeloop\private\tst\regulation\cppunit\hyper_ftac3\test.cpp(30): error C2143: syntax error: missing ';' before '{'

なぜですか?どのようにマクロは正しく1つのテンプレートパラメータを扱うことができますが、2つは失敗しますか?どのように私は簡単にそれをコンパイルして動作させることができますか?

編集: はすでに成功せずCPPUNIT_TEST((doTest<false,false>));error C2143: syntax error: missing ';' before ')'を取得)

+4

'の#define COMMA、'そして 'を渡したいことを見ているのでCPPUNIT_TEST(doTest ); ' –

+0

@PiotrSkotnicki:信じられないほど...それは動作します。しかし、なぜ私は本当に興味があるのか​​分かりません....あなたはこれを答えとして投稿することができますか? – jpo38

+0

'CPPUNIT_TEST(doTest ));' - > '&TestFixtureType::(doTest )'は無効です。プリプロセッサは 'CPPUNIT_TEST(doTest );と思う1つのパラメータ – Danh

答えて

2
CPPUNIT_TEST(doTest<false,false>); 

この1つは動作しませんので、マクロは2つのマクロパラメータ:doTest<falsefalse>を渡していると考えます。


CPPUNIT_TEST((doTest<false,false>)); 

&TestFixtureType::testMethodが無効である&TestFixtureType::(doTest<false,false>)に拡大していきますので、これは動作しません。


コメントにピョートルで述べたように、あなたはこのコードを使用することができます:

#define COMMA , 
class MyTestSuite2 : public CPPUNIT_NS::TestFixture 
{ 
    CPPUNIT_TEST_SUITE(MyTestSuite2); 
    CPPUNIT_TEST(doTest<false COMMA false>); 
    CPPUNIT_TEST(doTest<true COMMA false>); 
    CPPUNIT_TEST_SUITE_END(); 

    template<bool param1, bool param2> void doTest() { /* test here */ } 
}; 
CPPUNIT_TEST_SUITE_REGISTRATION(MyTestSuite2); 

プリプロセッサを使用すると、1つのパラメータ

+0

良い説明。 Danhに感謝します。 – jpo38

0

は、この作業を行いますしようとしましたか?

CPPUNIT_TEST((doTest<false,false>)); 
CPPUNIT_TEST((doTest<true,false>)); 

コンマを解析するときにマクロが難しいことができ、時々...

+0

を持っています。すでに成功していない。 – jpo38

1

,は、(親に囲ま場合を除いて)MACROセパレータとして解析されます。回避策

中間MACROを使用しての

方法:

#define COMMA , 

CPPUNIT_TEST(doTest<false COMMA false>); 

またはカンマを処理するために、あなたの元のマクロを修正:

#define CPPUNIT_TEST(testMethod, ...)       \ 
    CPPUNIT_TEST_SUITE_ADD_TEST(        \ 
     (new CPPUNIT_NS::TestCaller<TestFixtureType>(   \ 
        context.getTestNameFor(#testMethod),   \ 
        &TestFixtureType::testMethod , ##__VA_ARGS__, \ 
        context.makeFixture()))) 
関連する問題