【问题标题】:Declaring a struct in a .h file, defining it in a .c file and using the definition in another .c file?在 .h 文件中声明结构,在 .c 文件中定义它并在另一个 .c 文件中使用定义?
【发布时间】:2021-01-21 14:16:34
【问题描述】:

我有以下几点:

abstract.h

typedef struct s_strukt strukt;

abstract.c

typedef struct s_strukt {
    int x;
} strukt;

use_abstract.c

#include <stdio.h>
#include "abstract.h"

int main() {

    strukt s;
    s.x = 0;

    return 0;
}

编译,(gcc use_abstract.c) 或 (gcc use_abstract abstract.c) use_abstract.c 导致以下错误:

gcc use_abstract.c 
use_abstract.c:6:12: error: variable has incomplete type 'strukt' (aka 'struct s_strukt')
    strukt s;
           ^
./abstract.h:1:16: note: forward declaration of 'struct s_strukt'
typedef struct s_strukt strukt;
               ^
1 error generated.

如何在use_abstract.c中使用strukt的定义?

编辑: 我不想在头文件中定义结构,因为我想为不同的 .c 文件创建不同的定义。

Edit2(因为人们正在阅读 wayyyyy 到问题的“重点”而不是受到智力刺激):

目标

(1) 在头文件中声明一个结构体(本例为abstract.h)

(2) 在 .c 文件(本例为 abstract.c)中定义结构属性

(3) 在一个新的 .c 文件中使用上面的定义(本例中 use_abstract.c 访问 abstract.c 中定义的结构,在 abstract.h 中声明)

【问题讨论】:

  • 您在头文件abstract.h 中定义struct,而不是在一个C 文件中。
  • 您可以使用指向 strukt 的指针。但是,您不能分配此类指针,也不能取消引用它们。但是,您可以将它们存储在内存中并将它们传递给其他函数。
  • @dmuir 你是什么意思,你能举个例子吗?最好基于我的最小可重现示例。
  • 在 abstract.c 中有这样的typedef 是没有意义的。 typedef 不会在 abstract.c 文件之外“看到”。
  • @pointersarehard 在下面的评论中你写了 “我将在不同的 .c 文件中创建不同的结构”:你需要告诉我们更多关于这个的信息; Edit 问题。另请阅读:The XY Problem

标签: c abstract-class abstract-data-type


【解决方案1】:

您必须在您的标头中声明您的(“公共”)结构,并将这些标头包含在您使用它的源代码中。这里你的use_abstract.c 只知道存在一个名为s_strukt 的结构,包含"abstract.h",但它不知道它的任何字段。

还有一件事,在你的标题中使用这些 typedef 之一(两者都是相同的),而不是同时使用。

// 1)
struct name { ... };
typedef struct name name; // rename "struct name" to "name"

// 2)
typedef struct { ... } name; // define name as the provided struct

【讨论】:

  • 我不想在头文件中定义结构,因为不同的 .c 文件会有不同的结构定义。因此备选方案 2 消失了。当我使用替代 1 时,我得到 use_abstract.c:6:5: error: use of undeclared identifier 'strukt'; did you mean 'struct'? strukt s; 或者更确切地说是 1),因为我说 .h 中有一个结构,而 typedef 在 .c 中定义它,而不是在每个中定义 typedef。
  • @pointersarehard "不同的 .c 文件会有不同的结构定义" 好吧,这根本没有任何意义。您使用了错误的解决方案,下一个问题是您实际上试图用它解决什么问题。多态性?
  • 从技术上讲,您可以在不同的翻译单元中定义 2 个不同的定义,或者如果您需要一些接口(如在 java 中)或一些抽象,您需要使用基本结构来模拟它们,但我不确定你需要什么
  • @pointersarehard 那么显然你应该创建一个包含(指向)另外两个结构的结构,并根据需要分配每个结构。然后将相关的内部结构传递给不同的例程。
  • @pointersarehard 如果你想使用私有封装(调用者没有成员访问),那么你在一个 h 文件中声明一个结构并在单个 C 文件中定义它。如果您想使用没有私有封装的结构(任何人都可以进行成员访问),那么您可以在 h 文件中定义结构。这是仅有的两个有意义的有效用例 - 选择一个。
猜你喜欢
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2011-08-24
相关资源
最近更新 更多