在 .h 文件中声明一个结构,在 .c 文件中定义它并在另一个 .c 文件中使用该定义?
Declaring a struct in a .h file, defining it in a .c file and using the definition in another .c file?
我有以下内容:
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) or (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 文件中使用上面的定义(本例使用_abstract.c 访问 abstract.c 中定义的结构,在 abstract.h 中声明)
您必须在 header 中声明您的 ("public") 结构,并将那些 header 包含在您使用它的源代码中。这里你的 use_abstract.c
只知道有一个名为 s_strukt
的结构,它通过包含 "abstract.h"
而存在,但它不知道它的任何字段。
还有一件事,请在您的 header 中使用这些 typedef 中的任何一个(两者相同),不要同时使用。
// 1)
struct name { ... };
typedef struct name name; // rename "struct name" to "name"
// 2)
typedef struct { ... } name; // define name as the provided struct
我有以下内容:
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) or (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 文件中使用上面的定义(本例使用_abstract.c 访问 abstract.c 中定义的结构,在 abstract.h 中声明)
您必须在 header 中声明您的 ("public") 结构,并将那些 header 包含在您使用它的源代码中。这里你的 use_abstract.c
只知道有一个名为 s_strukt
的结构,它通过包含 "abstract.h"
而存在,但它不知道它的任何字段。
还有一件事,请在您的 header 中使用这些 typedef 中的任何一个(两者相同),不要同时使用。
// 1)
struct name { ... };
typedef struct name name; // rename "struct name" to "name"
// 2)
typedef struct { ... } name; // define name as the provided struct