这是我第一次测试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();
}
问题
当我正在构建测试时,我正在进行构建测试失败。更具体地说,我得到了这个:
In function `add': NetBeans/Calculator/calculator_helper.h:12: multiple definition of `add' build/Debug/GNU-Linux-x86/tests/tests/newcunittest.o:NetBeans/Calculator/./calculator_helper.h:12: first defined here collect2: error: ld returned 1 exit status
有人可以告诉我为什么会收到此错误。我尝试在谷歌搜索,但我发现没有运气。
答案 0 :(得分: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;
}
推荐阅读:
答案 1 :(得分:1)
此:
#ifndef CALCULATOR_HELPER_H
#define CALCULATOR_HELPER_H
#endif
是“包括警卫”。但它做错了:你的代码应该在#endif之前,而不是之后。
额外提示:不要在代码中使用“helper”这个词 - 总是有一个更好的。就像在这种情况下,您可以将其称为CALCULATOR_MATH_H
。
答案 2 :(得分:1)
链接器告诉您“添加”有两个定义。忽略其他回复引发的有效点一分钟,您的代码在Ubuntu 12.04.2上使用命令行上的gcc构建得很好。我像这样构建它并且没有看到警告(已经将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”,这将导致你的功能被包含并定义了两次,这要归功于它的包含防守。
您可能还想更改测试的样式,以便断言它期望的真实性。当add()做正确的事情时,你当前的测试失败了一个断言,这不是大多数人所期望的!试试这个:
void testAdd() {
int num1 = 2;
int num2 = 2;
int result = add(num1, num2);
CU_ASSERT(result == 4);
}