【问题标题】:Trying to understand differences between declaring structs in a .h file or in it's .c implementation file [duplicate]试图理解在 .h 文件或在它的 .c 实现文件中声明结构之间的区别[重复]
【发布时间】:2014-09-30 23:31:29
【问题描述】:

我不明白如何应用老师告诉我的内容。

我的老师告诉我的是,如果你想在 .h 文件中声明一个结构,那么你就是将结构公开,但是如果你在 .c 实现文件中声明结构,那么你就是将它设为私有。但是,如果我在我的 .c 文件中声明它,然后尝试将两者放在一个 main.c 文件中,我总是会出错,如果我将该声明移回 .h 文件,那么一切都会正常进行。我得到的错误始终是在 .c 文件中声明的前向声明错误

那么,我可以将结构声明(通过指针)放在我的 .c 文件中吗?我该怎么做呢?

TLDR ;我不明白如何在我的 .c 实现文件中使用与我的 .h 文件结合的指针来声明结构。

编辑:

这里是 .h 文件

typedef char *ListItemP;
typedef struct List *ListP;

//some functions

这里是 .c 文件

struct List
{
    int foo;
    ListItemP P;
};

//implementations of .h functions

但是,每当我按照上面的输入进行操作时,我总是会出错,我就是不知道为什么要挽救我的生命。

【问题讨论】:

  • 像其他任何东西一样声明它
  • 我们不是读心术的人。我们需要看一些代码。
  • 你能用一个小例子来更新你的问题吗?有多种声明类型的方法,但使用哪一种取决于您想要做什么。
  • 如果主程序需要了解结构的内部,则需要在头文件中定义结构,以便主代码和实现代码都可以使用它。如果主程序只需要一个指向结构类型的指针并且不需要了解内部,那么你可以将它隐藏在实现代码中。 (有几个密切相关的问题,一些来自本周,一些来自大约一年前,还有一些来自几年前——随着人们开始学习 C,这个话题每年都会出现。)
  • 我认为你的老师在谈论 P-IMPL 成语,又名不透明指针,又名柴郡猫。您可以在上面重复的问题中找到答案,或者直接在 Google 上找到答案。

标签: c pointers struct forward-declaration


【解决方案1】:

你没有提供任何代码,所以我不能说你的具体情况。

将某些内容单独放入 .h 或 .c 文件中不会影响其公开性或私密性。但是,通过将它放在一个 .h 文件中,该文件将 #included 放入 2 个不同的 .c 文件(我假设您这样做)意味着这些文件将使用相同的定义。

【讨论】:

  • 我进行了编辑以提供一小段代码示例。这不是针对任何一个项目,而是针对整体的。
【解决方案2】:

.h 文件中的声明可以被多个 .c 文件引用。这正是您在声明其他 .c 文件中的代码将使用的函数、结构和常量来调用您正在编写的文件中的函数时所需要的;如果两组代码在这些定义上不一致,它们之间的调用将无法按预期工作。

当然,您必须确保 .h 文件是自包含的,并且包含编译其中所有内容所需的所有内容 - 可能除了其他 .h 文件,但更常见的是.h 为它需要的东西发出它自己的包含。 (这增加了包含多次相同的 .h 的可能性,这就是为什么大多数都写有“包含守卫”,以确保其内容无论被包含多少次都只会出现一次。)

【讨论】:

  • 我对代码的示例部分进行了编辑。
猜你喜欢
  • 2010-12-21
  • 2013-08-28
  • 1970-01-01
  • 2014-08-14
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 2016-04-20
相关资源
最近更新 更多