微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 .h 文件中声明一个结构,在 .c 文件中定义它并在另一个 .c 文件中使用定义?

如何解决在 .h 文件中声明一个结构,在 .c 文件中定义它并在另一个 .c 文件中使用定义?

我有以下几点:

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(因为人们正在深入了解问题的“要点”,而不是在智力上受到刺激):

目标

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

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

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

解决方法

您必须在标头中声明(“公共”)结构,并将这些标头包含在您使用它的源中。在这里,您的 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。