“top”的多重定义/首先定义在这里错误
Posted
技术标签:
【中文标题】“top”的多重定义/首先定义在这里错误【英文标题】:Multiple definition of "top"/first defined here error 【发布时间】:2015-05-17 11:04:12 【问题描述】:这是我正在处理的一段代码中的一个问题。 基本上,我正在尝试编译我的代码,但我不断收到错误消息:“Top”的多重定义,指向我的 stack.c 文件(包含函数的文件),“第一次定义在这里”指向我的 main .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
请注意,“top”在 main.c 中没有一次被提及。同样,如果需要,我可以发布 stack.c 文件的整个代码。
【问题讨论】:
【参考方案1】:查看标题中的这四行:
struct stekas
int content;
struct stekas *link;
*top = NULL;
这些行做了三件事:
-
声明一个名为
struct stekas
的结构,
声明一个名为struct stekas
的变量top
,并且
为变量top
提供定义。
第 1 项和第 2 项应该在标题中,而第 3 项应该在 C 文件中,而不是在标题中。
将定义放在头文件中的问题在于,每次从 C 文件中包含头文件时,该 C 文件都会为头文件中定义的任何内容创建一个新定义。如果您包含来自三个 C 文件的标头,链接器将看到三个冲突的 top
定义,即使您从未在这些 C 文件的代码中的任何地方引用该变量。
如下更改标题:
struct stekas
int content;
struct stekas *link;
;
extern struct stekas *top;
将此行添加到您的任何 C 文件中:
struct stekas *top = NULL;
这将解决链接问题。
【讨论】:
谢谢,这确实解决了链接问题。现在我在我的 stack.c 文件的其余部分中遇到了很多“未定义对“顶部”的引用”问题,但就多个定义而言,这个问题已经解决了。 @Anstane 将struct stekas *top = NULL;
添加到您的C 文件之一应该可以解决“未定义对top
的引用”问题,只要您同时编译所有C 文件。
以上是关于“top”的多重定义/首先定义在这里错误的主要内容,如果未能解决你的问题,请参考以下文章