GCC编译器错误:“重新定义...以前定义的”

时间:2009-04-02 01:00:37

标签: c++ gcc compiler-construction

我得到了很多“重新定义之前在此定义的x .... x”。请注意这个错误是什么意思?

4 个答案:

答案 0 :(得分:30)

您需要限制每个文件仅包含一次。您可以通过两种方式完成此操作。

1)在头文件的顶部放置:

#pragma once

或2)如果您的编译器不支持,请将其放在头文件的顶部/末尾:

#ifndef _MYFILE_H_
#define _MYFILE_H_
...
#endif

将MYFILE替换为您的文件名,并将...替换为头文件的内容。

答案 1 :(得分:10)

错误意味着在一个地方定义了一个符号,并在另一个地方制作了另一个定义。

如果遇到以下情况,可能会发生这种情况:

  • 如果您定义两个具有相同名称的功能
  • 如果函数与其原型之间存在不匹配
  • 在定义之前调用非平凡函数,并且没有原型

在最后一种情况下,实际函数与编译器在没有原型使用时所假定的“隐式声明”之间将存在不匹配。

可以通过以下方式避免这些情况:

  • 确保函数原型只声明一次
  • 确保所有函数在其范围内具有唯一名称(即,如果它们是static,则在文件中,或者如果在目标文件之间使用它们则是唯一的)
  • 如果在源文件中使用extern语句来声明原型,请务必小心。最好使用相应头文件中的原型。
  • 确保所有函数都有原型 - 在static函数的情况下在源文件中,或者如果要由其他目标文件使用,则在头文件中。
  • 确保每个源文件只能包含一次所有头文件,方法是使用Mehrdad和Brian R. Bondy建议的任何一种结构

答案 2 :(得分:7)

您可能包含两次头文件。确保您的标头文件被#ifndef语句包围。

http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html

答案 3 :(得分:0)

同样的事情发生在我身上,这是因为我意外地包含了.c / .cpp文件(在其中)而不是头文件。

这肯定会给你带来很多错误。