全局访问typedef

时间:2014-06-30 08:52:02

标签: c struct header typedef

我找到了一些我希望合并到我正在编写的C程序中的源代码。我们称之为existing.c。此文件包含结构的typedef,该结构是文件中较低的函数的参数所必需的。我想在我的文件main.c中调用此函数。我知道我可以通过在main.c中声明一个函数原型来访问该函数,但我还需要访问该结构定义来声明和调用该函数。

现有的c没有.h文件,虽然我当然可以创建一个,比如existing.h。但是如果我把typedef放在existing.h中,那么我似乎必须把#include“existing.h”放到existing.c中,这对我对头文件的理解似乎不正确。我认为他们的目的是使某个文件中的代码可供其他编译单元使用,并且该文件本身不应该要求。

所以我想我的主要问题很简单,如何在我自己的文件main.c中使用existing.c中定义的函数?我是否可以在没有头文件的情况下执行此操作,例如在main.c中放置某种结构原型,类似于函数原型,或者将结构指定为外部或沿着这些行的某些内容?

编辑:我可能应该在我的原始帖子中提到我希望避免使用标题的一个原因是,如果将来有此源的修订版,我可以不加改变地包含existing.c文件。从答案来看,这是不可能的。

2 个答案:

答案 0 :(得分:3)

  

然后好像我必须把#include" existing.h"进入existing.c,这似乎不正确

这是正确和正确的方法。

如果多个编译单元需要这些声明,则将声明放在头文件中,包含该实现的源代码文件几乎总是包含头文件的文件之一。

答案 1 :(得分:3)

  

如果我把typedef放在existing.h中,那么我似乎必须把#include" existing.h" into existing.c,根据我对头文件的了解,这似乎不正确。

这正是要做的事情:将typedef移到existing.h标题中,然后在existing.c和代码中包含该标题。

  

我认为他们的目的是让某个文件中的代码可供其他编译单元使用,并且不应该被该文件本身所需。

这就是标题的工作方式 - 您可以从实现文件和使用该实现的代码中包含它们。

尽管可以编写与实现中的内容匹配的标头,并且不使用它而不包含在实现文件本身中,但这是不可取的:在实现中包含标头的一个原因是让编译器根据标题中的函数原型检查代码,并为可能发现的任何差异产生错误。