1

我正在创建一个应该模拟 MIPS 管道的大型程序。我正在尝试尽可能地模块化我的代码以使事情变得简单,但是我在编译时遇到了麻烦。

目前我的程序包含以下文件:

  • pipe.c --- 包含主要
  • IF.h
  • ID.h
  • EX.h
  • 内存.h
  • WB.h

  • global.h --- 包含全局#define 函数

  • reg.h
  • 算法
  • 控制.h
  • dMem.h
  • fBuffer.h
  • 解析器.h
  • 二进制文件

我是 C 编程新手,但我已经在每个头文件中使用 #ifndef、#define、#endif 来保护自己免受多重包含的影响。我的问题是,当我编译时,我收到错误声明:“以前的隐式声明......”

许多头文件被多个文件使用,所以我不确定这是否是问题所在。有什么我想念的大事吗?

4

1 回答 1

2

声明意味着有一些东西没有在头文件中声明(相反,编译器只是找到了函数)。先前的隐式声明意味着它在假定“原始”函数的隐式声明之后(或者,我猜,正如 Doug 在评论中建议的另一个同名函数)之后遇到声明。

发生这种情况的方式有很多种:

  • 也许您没有在关联文件中包含标题。所以IF.c不包括IF.h。编译器将读取IF.c并创建隐式定义。IF.h稍后,当它在其他地方读取时,它会给出这个错误。

  • 也许您在不包含相关标题的文件中使用了一个函数。所以也许IF.h定义了myfunction(),但你使用myfunction()indMem.c并且不包括IF.h在那里。所以编译器在看到 in when 包含在定义之前看到使用myfunction()in 。dMem.cIF.hIF.c

  • 根本没有头文件,你可以用相互递归的函数来得到它。请参阅如何在 C 中对函数进行排序?“函数的先前隐式声明在这里”错误

  • 正如 Doug 建议的那样,您定义了两个具有相同名称的函数(并且在标题中没有定义)。

基本上,在某个地方,不知何故,编译器在到达带有相关声明的标头之前到达了一个函数。当它确实找到标题时,它意识到事情搞砸了并产生了错误。

(标题错误的一个经典来源是将“ifdefs”从一个文件剪切+粘贴到另一个文件并忘记更改名称......)

[再次阅读您的问题,我假设您只列出了头文件。但现在我看到这就是你拥有的所有文件。为什么你的头文件比源文件多得多?通常每个源文件都与一个或两个包含它定义的函数的声明的头文件相关联(尽管它可能会导入它需要支持的其他函数)。这与您的编译器错误无关,但听起来您可能需要拆分源代码。它还表明要么我误解了你,要么你误解了标题通常是如何使用的。]

于 2012-08-13T00:28:34.313 回答