【问题标题】:problem with "multiple definition"“多重定义”的问题
【发布时间】:2011-09-25 13:01:49
【问题描述】:

假设我有一个很小的头文件,像这样:

#ifndef A_H_
#define A_H_

void print();
int getInt()
{ //ERROR HERE
    return 5;
}

#endif /* A_H_ */

还有一个像这样实现打印的源文件:

#include "a.h"

void print()
{
    printf("%d\n",getInt()); //WARNING HERE
}

还有我的 main() 函数代码:

#include <stdio.h>
#include <stdlib.h>
#include "a.h"

int main(void)
{
    print();
    return EXIT_SUCCESS;
}

注意getInt 在头文件中定义并在源文件中调用。 当我编译时,我在头文件中得到multiple definition ofgetInt'`,但我只有 定义一次!源文件 (.c) 只调用它。我的问题是什么? 谢谢

【问题讨论】:

  • 如给定的,这会编译得很好。您真正的问题可能包括两次标头,或将其包含在多个文件中。
  • 在问题中发布代码的第一条规则:确保它确实重现了问题。你会自己找到解决方案的。

标签: c header multiple-definition-error


【解决方案1】:

您可能也将头文件包含到另一个源文件中。您可以尝试将定义移至 .c 文件或将 getInt() 声明为 inline

【讨论】:

  • 是的,我在 a.c 和 main.c 中都包含了它,但我仍然不明白问题所在....注意我已经在 main.c 中添加了代码
  • 问题是 C 预处理器是愚蠢的。而#include 正是它的名字所暗示的:它将一个文件的内容包含到另一个文件中。因此,当您尝试编译程序时,链接器会看到 getIntmain.ca.c 中都定义了,因此会出现错误。将其声明为inline 可以解决问题,因为内联函数的行为就好像它们没有定义一样,它们只有一个声明。多个声明是可以的,但定义必须是唯一的。
【解决方案2】:

您应该将getInt() 移动到交流电中,即

啊哈:

#ifndef A_H_
#define A_H_

void print(void);
int getInt(void);

#endif /* A_H_ */

交流:

#include <stdio.h>
#include "a.h"

void print(void)
{
    printf("%d\n",getInt());
}

int getInt(void)
{
    return 5;
}

main.c:

#include <stdio.h>
#include <stdlib.h>
#include "a.h"

int main(void)
{
    print();
    return EXIT_SUCCESS;
}

根据经验,接口(即外部可访问函数的原型,以及相关的typedef和常量等)属于.h文件,而补充(即实际的函数定义,加上私有(静态)函数和其他内部内容)属于 .c 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多