2012年4月6日金曜日

C で main の前に関数コール

C言語のテストフレームワークを書いていて知ったこと。

C言語版のテストフレームワークでも、Google Test のようにテストの登録をいちいちしなくていいインターフェイスを目指していました。

それを実現するためには、どうしても main 関数が呼ばれる前に関数を呼ぶ必要がありました。
C++ なら、
int dummy = func();
int main()
{
    return 0;
}
とか、コンストラクタとか使う方法があったのですが、
C だと、上の方法が使えず。(いけると思っていたのでガッカリ)
もちろんコンストラクタなどないので、どうしたもんかという状態でした。

__attribute__((constructor))
Google 先生に聞いてみると __attribute__((constructor)) ってのがヒット。

これだ!えいや!できたー!!

あ、でもコレ GCC でないとダメじゃん。

あきらめるのはまだ早い
gcc には __attribute__((constructor)) というものがあるが、
Visual Studio ではどうしたらいいの?という事で、Google で検索してみると以下の記事がヒットしました。
http://stackoverflow.com/questions/1113409/attribute-constructor-equivalent-in-vc

まんま答えがありました。 CRT$XCU を使うようです。

CRT のグローバル初期化にぶち込むってことですかね。
MSDNにも説明がありました。

こちらも問題なく動作しました。
とりあえず、Visual Studio と GCC で使えれば個人的に満足なので、他の環境は考えないことにする。

C言語テストフレームワークとしての iutest
branche で作業してますので、良かったら見てください。

今のところ、以下のような感じでテストが書けるようになりました。
#include "iutest_c.h"

IUTEST_C_WORKSPACE(); // ワークの構築用に必要...

int main(int argc, char* argv[])
{
    iuInitIrisUnitTest(&argc, argv);
    return IUTEST_RUN_ALL_TESTS();
}

IUTEST(AssertionTest, Simple)
{
    IUTEST_ASSERT_EQ(0, 0);
    IUTEST_ASSERT_NE(0, 1);
    IUTEST_ASSERT_LE(1, 1);
    IUTEST_ASSERT_LT(0, 1);
    IUTEST_ASSERT_GE(1, 1);
    IUTEST_ASSERT_GT(1, 0);
}

0 件のコメント:

コメントを投稿