2

Cプログラムをテストするのは初めてです。テストしたい次のヘッダーファイルがあります。

#ifndef CALCULATOR_HELPER_H
#define CALCULATOR_HELPER_H
#endif

    int add(int num1, int num2) {
        return num1 + num2;
    }

フレームワークCUnitを使用してテストしています。NetbeansをIDEとして使用しています。以下はコードです。

#include <stdio.h>
#include <stdlib.h>
#include "CUnit/Basic.h"
#include "calculator_helper.h"

/*
 * CUnit Test Suite
 */

int init_suite(void) {
    return 0;
}

int clean_suite(void) {
    return 0;
}

/* IMPORTANT PART: */

void testAdd() {
    int num1 = 2;
    int num2 = 2;
    int result = add(num1, num2);
    if (result == 4) {
        CU_ASSERT(0);
    }
}

int main() {
    CU_pSuite pSuite = NULL;

    /* Initialize the CUnit test registry */
    if (CUE_SUCCESS != CU_initialize_registry())
        return CU_get_error();

    /* Add a suite to the registry */
    pSuite = CU_add_suite("newcunittest", init_suite, clean_suite);
    if (NULL == pSuite) {
        CU_cleanup_registry();
        return CU_get_error();
    }

    /* Add the tests to the suite */
    if ((NULL == CU_add_test(pSuite, "testAdd", testAdd))) {
        CU_cleanup_registry();
        return CU_get_error();
    }

    /* Run all tests using the CUnit Basic interface */
    CU_basic_set_mode(CU_BRM_VERBOSE);
    CU_basic_run_tests();
    CU_cleanup_registry();
    return CU_get_error();
}

問題

テストをビルドしているときに、ビルドテストが失敗します。より具体的には、私はこれを取得します:

関数`add':NetBeans / Calculator / calculator_helper.h:12:
「追加」の複数の定義
build / Debug / GNU-Linux-x86 / tests / tests / newcunittest.o:NetBeans / Calculator /./calculator_helper.h:12:
ここで最初に定義されたcollect2:エラー:ldが1つの終了ステータスを返しました

なぜこのエラーが発生するのか誰か教えてもらえますか?グーグルで検索してみましたが、うまくいきませんでした。

4

3 に答える 3

2

テストしたい次のヘッダーファイルがあります。

ヘッダーファイルで関数を定義しています。

int add(int num1, int num2) {
    return num1 + num2;
}

ヘッダーで宣言します。

#ifndef CALCULATOR_HELPER_H
#define CALCULATOR_HELPER_H

int add(int num1, int num2);

#endif      /* the endif goes at the end of the file */

...そしてそれをソースファイルで定義します:

#include "helper.h"

int add(int num1, int num2) {
    return num1 + num2;
}

推奨読書:

于 2013-03-01T12:39:59.483 に答える
1

これ:

#ifndef CALCULATOR_HELPER_H
#define CALCULATOR_HELPER_H
#endif

「インクルードガード」です。しかし、それは間違っています。コードは#endifの後ではなく、前に配置されることになっています。

ボーナスのヒント:コードで「ヘルパー」という単語を使用しないでください。常により良いものがあります。この場合のように、あなたはそれを呼ぶことができますCALCULATOR_MATH_H

于 2013-03-01T12:37:58.040 に答える
1

リンカーは、「追加」には 2 つの定義があることを示しています。他の返信によって提起された有効なポイントをしばらく無視すると、コマンドラインで gcc を使用して Ubuntu 12.04.2 でコードを正常にビルドできます。私はこのようにビルドしましたが、警告は表示されませんでした (libcunit.a を /usr/local/lib にインストールしました):

gcc -Wall -c testsuite.c
gcc testsuite.o -L/usr/local/lib -lcunit -static -o testsuite

実行され、テストで予想どおり失敗しました。

...
Suite: newcunittest
  Test: testAdd ...FAILED
    1. testsuite.c:25  - 0
...

その場合、問題は Netbeans で「追加」関数を定義している何かによって引き起こされているか、投稿したものよりもビルドに多くのものがあり、他のファイルに「calculator_helper.h」が含まれているため、関数がインクルード ガードが壊れているため、インクルードと定義が 2 回行われます。

テストのスタイルを変更して、真であると期待されるものをアサートすることもできます。add() が正しいことを行うと、現在のテストはアサーションに失敗します。これは、ほとんどの人が期待することではありません! 代わりにこれを試してください:

void testAdd() {
    int num1 = 2;
    int num2 = 2;
    int result = add(num1, num2);
    CU_ASSERT(result == 4);
}
于 2013-03-15T16:26:20.723 に答える