“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”的多重定义/首先定义在这里错误的主要内容,如果未能解决你的问题,请参考以下文章

只是另一个“此处首先定义的多重定义”错误

使用 Qt Creator 时出错:“多重定义”“首先在这里定义”

“多重定义”,“此处首先定义”错误

在多文件中C语言中全局变量的重定义

在多文件中C语言中全局变量的重定义

在多文件中C语言中全局变量的重定义