C - 错误LNK2005,_cmd已在复杂中定义

时间:2017-05-24 12:23:12

标签: c visual-studio-2017

在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");
    }

我们这里有一些函数可以通过命令行获取一些参数作为输入。功能实现尚未完成。 我需要帮助解决错误。

1 个答案:

答案 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 }
};