识别C中头文件中的结构
Recognising structs inside header files in C
我正在尝试使用散列-table 创建一个字典,因此我创建了一个名为 node
的结构,它有一个 word
和一个 [=16] =] 与之关联的指针:
// Represents a node in a hash table
typedef struct node
{
char word[LENGTH + 1];
struct node *next;
}
node;
// Hash table
struct node *table[5];
在 main
中,我已经初始化了一个 node
,现在正尝试将其加载到散列中-table:
void hash_insert_node(struct node **hash_table, struct node *n, int value)
{
hash_table[value] = n;
printf("%s\n", hash_table[value]->word);
}
我在一个名为 dictionaries.h
的文件中有这个函数的原型,这个代码在一个名为 dictionaries.c
的文件中。在 dictionaries.c
的顶部,我有
#include "dictionaries.h"
如果我现在 运行 代码,我会收到以下错误:
declaration of 'struct node' will not be visible outside of this function
[-Werror,-Wvisibility]
我发现解决这个问题的唯一方法是将结构的定义移动到 dictionaries.h
,但这看起来很愚蠢。
这可能是一个微不足道的问题,但我将不胜感激任何帮助。
通常,如果您创建了一个数据结构,您希望它的实现对用户来说是抽象的,那么用户不需要知道它自己包含哪些变量。
如果您想知道散列 table 中的单词,您应该在定义结构的 .c 文件中编写一个 getter 函数,并将该函数的声明包含在 .h 文件中.
.c 文件中的函数实现示例。
char *GetHashWord(struct node **hash_table, int value)
{
return hash_table[value]->word;
}
减速示例:
char *GetHashWord(struct node **hash_table, int value);
这样用户就不知道您是如何实现该结构的,并且您可以包含一定程度的抽象并且仍然提供您希望他在需要时访问的变量。
The only way I've found to resolve this is to move the definition of the structure to dictionaries.h, but that seems silly.
我觉得这并不傻,.h
文件似乎是放置 struct
声明的完美位置。
出现问题是因为您的函数不知道 struct
的存在。
您可以通过一些不同的方式解决此问题:
- Forward declare the
struct
在函数声明之前,即:
struct node;
char *GetHashWord(struct node **hash_table, int value);
- 将
struct
放在一个单独的 .h
文件中,例如,data_structure.h
和 #include
将其命名为 dictionaries.h
。
- 保留您的原始修复,我认为没有理由将其视为不良做法。
附带说明一下,如果您要为您的结构指定一个别名,您也可以使用它:
void hash_insert_node(node **hash_table, node *n, int value){/*...*/}
^^^^ ^^^^
我正在尝试使用散列-table 创建一个字典,因此我创建了一个名为 node
的结构,它有一个 word
和一个 [=16] =] 与之关联的指针:
// Represents a node in a hash table
typedef struct node
{
char word[LENGTH + 1];
struct node *next;
}
node;
// Hash table
struct node *table[5];
在 main
中,我已经初始化了一个 node
,现在正尝试将其加载到散列中-table:
void hash_insert_node(struct node **hash_table, struct node *n, int value)
{
hash_table[value] = n;
printf("%s\n", hash_table[value]->word);
}
我在一个名为 dictionaries.h
的文件中有这个函数的原型,这个代码在一个名为 dictionaries.c
的文件中。在 dictionaries.c
的顶部,我有
#include "dictionaries.h"
如果我现在 运行 代码,我会收到以下错误:
declaration of 'struct node' will not be visible outside of this function [-Werror,-Wvisibility]
我发现解决这个问题的唯一方法是将结构的定义移动到 dictionaries.h
,但这看起来很愚蠢。
这可能是一个微不足道的问题,但我将不胜感激任何帮助。
通常,如果您创建了一个数据结构,您希望它的实现对用户来说是抽象的,那么用户不需要知道它自己包含哪些变量。 如果您想知道散列 table 中的单词,您应该在定义结构的 .c 文件中编写一个 getter 函数,并将该函数的声明包含在 .h 文件中. .c 文件中的函数实现示例。
char *GetHashWord(struct node **hash_table, int value)
{
return hash_table[value]->word;
}
减速示例:
char *GetHashWord(struct node **hash_table, int value);
这样用户就不知道您是如何实现该结构的,并且您可以包含一定程度的抽象并且仍然提供您希望他在需要时访问的变量。
The only way I've found to resolve this is to move the definition of the structure to dictionaries.h, but that seems silly.
我觉得这并不傻,.h
文件似乎是放置 struct
声明的完美位置。
出现问题是因为您的函数不知道 struct
的存在。
您可以通过一些不同的方式解决此问题:
- Forward declare the
struct
在函数声明之前,即:
struct node;
char *GetHashWord(struct node **hash_table, int value);
- 将
struct
放在一个单独的.h
文件中,例如,data_structure.h
和#include
将其命名为dictionaries.h
。 - 保留您的原始修复,我认为没有理由将其视为不良做法。
附带说明一下,如果您要为您的结构指定一个别名,您也可以使用它:
void hash_insert_node(node **hash_table, node *n, int value){/*...*/}
^^^^ ^^^^