【问题标题】:Multiple definition of "top"/first defined here error“top”的多重定义/首先定义在这里错误
【发布时间】: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 文件的整个代码。

【问题讨论】:

    标签: c


    【解决方案1】:

    查看标题中的这四行:

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

    这些行做了三件事:

    1. 声明一个名为struct stekas的结构,
    2. 声明一个名为struct stekas 的变量top,并且
    3. 为变量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 文件。
    猜你喜欢
    • 2021-12-28
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多