【问题标题】:C using a forward declaration within a function definitionC 在函数定义中使用前向声明
【发布时间】:2013-12-02 23:28:23
【问题描述】:

我正在处理一个项目,在该项目中我不得不使用一些以前编写的代码,这些代码使用许多头文件调用其他头文件。我试图将我的应用程序分开,但我仍然需要使用前面代码中定义的许多类型和函数。

在引用其他头文件中声明的数据类型时,我在自己的头文件中添加了前向声明。我现在的问题是,我试图从源文件的函数定义中引用联合类型,但我不太确定该怎么做。

旧头文件:

/* filename: include.h */

typedef union SOME_UNION_TYPE
{
  int a;
  .
  .
}SOME_UNION_TYPE;


我的源文件:

/* filename: file.c */

void func()
{
  SOME_UNION_TYPE A;
  .
  .
  return;
}


我知道在我的源代码中包含“include.h”会更容易,但我会尽量避免它。到目前为止,我的尝试是在我的头文件中转发声明联合,希望将 typedef 名称暴露给编译器。

我的头文件:

/* filename: file.h */

union SOME_UNION_TYPE;


但是,当我编译时,我收到一个错误,抱怨 func() 中 A 的大小未知。

在此先感谢您的帮助。

【问题讨论】:

  • 你不能分配前向声明的东西。但是,您可以创建一个指向任何被前向声明的指针。
  • @NoahWatkins 谢谢!我假设标头中的前向声明在编译时提供了大小信息。我需要花一些时间来更好地了解编译和链接过程。

标签: c forward-declaration


【解决方案1】:

如果您需要创建该类型的实际实例,则需要完整的声明,而不仅仅是名称。

在这种情况下正确的做法是咬紧牙关,包含定义类型的头文件。

【讨论】:

  • 补充一点:你不能指望编译器在不知道变量需要多长时间的情况下为变量分配存储空间!这就是为什么您可以转发声明结构并为它们定义指针,因为所有指针的长度都相同;但是您不能定义所述类型的结构。
  • @caf 谢谢。看起来我可以选择使用指向该类型的指针,但这实际上对我有什么好处,除了加快编译速度吗?
  • @dsell002:不,使用指向不完整类型的指针只能做非常有限的事情。
  • @caf:明白。感谢您的帮助!
【解决方案2】:

#include 指令是不可回避的。如果您担心其他人的代码会污染您的代码,您可以制作一个包含您需要的标头的标头,然后直接包含该标头。

重复代码是不好的。

【讨论】:

  • 感谢您的回复!你能解释一下复制代码是什么意思吗?我不打算重写代码。谢谢。
【解决方案3】:

其他代码可能包含一堆其他标头,因为它需要它们!您应该只包含其他标头,否则您复制的代码很糟糕。

【讨论】:

  • 你的正确。它肯定需要其他文件,但在许多情况下,存在相互引用的头文件。我不是最好的程序员,但对我来说这似乎是糟糕的设计。
  • 它可能是一个写得很糟糕的库,它吸收了太多东西,但你无法解决这个问题。避免#include 而是复制代码更糟糕!
  • +1 到@John3136。代码重复是瘟疫。看看你是否可以花一些时间来修复现有的标头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多