回答編集履歴

1 加筆修正

majiponi

majiponi score 861

2017/01/25 11:57  投稿

main関数をテスト対象のファイルから分離する。
現在テスト対象にあるmain関数はtest1mainなどの名前をつける。
main関数の中ではその関数を呼び出すだけのコードを書く。
テスト対象を切り替えるときにmain関数を書き換える。
要するに、main関数が複数定義されているのが問題です。
1つのファイルで1定義でも、複数のファイルをリンクする(まとめる)ときに、複数見つかってしまい、どのmain関数を実行すればよいか分からなくなるので、リンク・エラーが発生します。
とかですかね。一度コンパイルしてできたコードを、どうリンクさせるかだけで動作を振り分けるのはすごく難しいです。
対処法は、main関数を1つに絞ることです。
一度コンパイルしてできたコードを、リンクさせるかだけで動作を振り分けるのはすごく難しい(C++なら可能だがCでは不可能?)ので、どうしてもmain関数の書き換えは必要になります。そこで登場するのがマクロです。
現在、calc.cの中にあるmain関数の名前を変えます(calcmainなど)。
次に、main.cの中にあるmain関数に、calcmainを呼び出すコードを書き、calc.cをテストに含める場合のみに定義するマクロ(例えば、LINKCALC_C)を利用して、ifdef/endifで囲みます。
この方法を利用すれば、calc.c以外にファイルを追加する際でもリンクエラーは出なくなります。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る