这是我正在处理的一段代码中遇到的问题。 基本上,我正在尝试编译我的代码并且我不断收到错误:“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文件的整个代码(如果需要的话)。
答案 0 :(得分:0)
查看标题中的这四行:
struct stekas {
int content;
struct stekas *link;
}*top = NULL;
这些行做了三件事:
struct stekas
,struct stekas
的{{1}}类型的变量,以及top
的定义。项目1和2应该在标题中,而项目3应该在C文件中,而不是在标题中。
将定义放在标头中的问题是,每次从C文件中包含标头时,该C文件都会为标头中定义的内容生成新的定义。如果您包含来自三个C文件的标头,链接器将看到top
的三个冲突定义,即使您从未在这些C文件的代码中的任何位置引用该变量。
按如下方式更改标题:
top
将此行添加到任何C文件中:
struct stekas {
int content;
struct stekas *link;
};
extern struct stekas *top;
这将解决链接问题。