在Visual Studio中编译我的代码时出现此错误,我需要帮助:
Error LNK2005: _cmd already defined in complex.obj
我有以下C档案:
### File name: Main.c ###
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include "complex.h"
int main()
{
char command[30];
int i;
FOREVER
if (scanf("%s", command) == 1)
{
for (i = 0; cmd[i].func != NULL; i++)/*searcing the relevant function*/
{
if (strcmp(command, cmd[i].name) == 0)
break;
}
if (cmd[i].func == NULL)
printf("Command does not exist: %s\n", command);
else
(*(cmd[i]).func)();
}
}
和此:
### File name: Complex.h ###
#define FOREVER for(;;)
typedef struct complex
{
double real;
double imag;
}complex;
void read_comp(void);
void print_comp(void);
void add_comp(void);
void sub_comp(void);
void mult_comp_real(void);
void mult_comp_img(void);
void mult_comp_comp(void);
void abs_comp(void);
void halt(void);
void empty_string(void);
void stop(void);
struct STR{
char* name;
void(*func)(void);/*pointer to function*/
}cmd[] = {
{ "read_comp", read_comp },
{ "print_comp", print_comp },
{ "add_comp", add_comp },
{ "sub_comp", sub_comp },
{ "mult_comp_real", mult_comp_real },
{ "mult_comp_img", mult_comp_img },
{ "mult_comp_comp", mult_comp_comp },
{ "abs_comp", abs_comp },
{ "halt", halt },
{ "stop", stop }
};
和此:
### File name: Complex.c ###
#include "complex.h"
void stop(void)
{
exit(1);
}
void read_comp(void)
{
printf("read_comp\n");
}
void print_comp(void)
{
printf("print_comp\n");
}
void add_comp(void)
{
printf("add_comp\n");
}
void sub_comp(void)
{
printf("sub_comp\n");
}
void mult_comp_real(void)
{
printf("mult_comp_real\n");
}
void mult_comp_img(void)
{
printf("mult_comp_img\n");
}
void mult_comp_comp(void)
{
printf("mult_comp_comp\n");
}
void abs_comp(void)
{
printf("abs_comp\n");
}
void halt(void)
{
printf("halt\n");
}
void empty_string(void)
{
printf("Empty sting, Please try again\n");
}
我们这里有一些函数可以通过命令行获取一些参数作为输入。功能实现尚未完成。 我需要帮助解决错误。
答案 0 :(得分:2)
由于您在complex.h中定义了结构cmd
,因此它将在两个目标文件中实例化,然后导致链接错误。
您应该只在两个文件中的一个文件中定义结构,并在头文件中将其声明为extern 。
这会进入您的头文件:
struct STR{
char* name;
void(*func)(void);/*pointer to function*/
};
extern struct STR *cmd;
例如在complex.c:
中struct STR cmd[] = {
{ "read_comp", read_comp },
{ "print_comp", print_comp },
{ "add_comp", add_comp },
{ "sub_comp", sub_comp },
{ "mult_comp_real", mult_comp_real },
{ "mult_comp_img", mult_comp_img },
{ "mult_comp_comp", mult_comp_comp },
{ "abs_comp", abs_comp },
{ "halt", halt },
{ "stop", stop }
};