“top”的多重定义/首先在此定义错误

时间:2015-05-17 11:04:13

标签: c

这是我正在处理的一段代码中遇到的问题。 基本上,我正在尝试编译我的代码并且我不断收到错误:“Top”的多个定义,指向我的stack.c文件(包含函数的文件),“first first here here”指向我的主.c文件。从阅读其他类似名称的问题来看,它似乎与包含有关。 这是头文件:

#ifndef STACK_H
#define STACK_H
#define MAXSIZE 10

struct stekas{
int content;
struct stekas *link;
}*top = NULL;

void push(void);
void pop(void);
void display(void);
void help(void);

#endif // STACK_H_INCLUDED

stack.c和main.c文件都具有完全相同的#includes和#defines:

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
#define MAXSIZE 10

请注意,main.c中没有引用“top”。同样,如果需要,我可以发布stack.c文件的整个代码(如果需要的话)。

1 个答案:

答案 0 :(得分:0)

查看标题中的这四行:

struct stekas {
    int content;
    struct stekas *link;
}*top = NULL;

这些行做了三件事:

  1. 声明一个名为struct stekas
  2. 的结构
  3. 声明名为struct stekas的{​​{1}}类型的变量,以及
  4. 提供变量top的定义。
  5. 项目1和2应该在标题中,而项目3应该在C文件中,而不是在标题中。

    将定义放在标头中的问题是,每次从C文件中包含标头时,该C文件都会为标头中定义的内容生成新的定义。如果您包含来自三个C文件的标头,链接器将看到top的三个冲突定义,即使您从未在这些C文件的代码中的任何位置引用该变量。

    按如下方式更改标题:

    top

    将此行添加到任何C文件中:

    struct stekas {
        int content;
        struct stekas *link;
    };
    extern struct stekas *top;
    

    这将解决链接问题。