如何将一个模块中的 typedef 结构用作另一个模块中的全局变量?

How can I use a typedef struct from one module as a global variable in another module?

我正在学习 C,但我遇到了一些作业。

我正在尝试使用一个链表,该链表已作为一个 header 的一部分在另一个 header 中实现。我的列表实现包括一个 typedef,如下所示:

typedef struct queue_T
{
    int count;
    struct member_T * first;
    struct member_T * last;
} * queue_T;

上面的typedef在一个源文件中(.c)。我目前正在尝试编写第二个使用这种类型的源文件。在这个源文件中,我试图声明一些 queue_T 变量用作全局变量。我是这样做的:

#include <math.h>
#include "mathfns.h"
#include "queue.h"

queue_T primes;
queue_T squares;
queue_T cubes;

primes = new_queue();
squares = new_queue();
cubes= new_queue();

new_queue() 是 queue_T 类型的初始化函数,mathfns.h 是与您正在查看的源文件关联的 header 文件段落。 queue_T 变量的上述声明在我尝试编译时默认为整数,当我尝试初始化变量时它会生成错误。我怎样才能避免这种情况?我应该 #include queue.h header 在 mathfns.h 文件中

谢谢。

正如我在评论中所写,您不能在函数外部执行函数调用。您甚至不能在函数外部执行赋值语句,尽管您可以为全局变量提供常量 initializers,并且语法类似于赋值语句。然而,初始化程序是不可执行的——它们由系统在程序执行范围之外处理(您可以将其视为无法在其中执行函数调用的原因)。

据推测,函数 new_queue() 分配一个新的 struct queue_T 并初始化它,然后 returns 一个指向调用者的指针。这很好而且很有用,但是如果您只想初始化现有的 struct queue_T 结构怎么办?实际上,如果您想提供该类型的预初始化全局对象,那么这样的工具正是您所需要的。例如:

static struct queue_T primes_struct = { 0, NULL, NULL };
queue_T const primes = &primes_struct;
/* ... */

但是像这样编写文字结构初始值设定项既乏味又容易出错。毕竟,如果在编写该代码后更改了结构定义怎么办?事实上,如果您只是想将 struct 的所有成员初始化为零/NULL,初始化器的常规形式只是 { 0 } (单个元素)。但即便如此,经过一些修改也可能最终不是您想要的。

另一种方法是让您的 queue.h 声明一个 可用于初始化空 struct queue_T,并在任何地方使用它(包括在函数 new_queue() 中,以确保在所有地方执行相同的初始化)。因此,在 queue.h 的某个地方,您可能有 ...

#define EMPTY_QUEUE { 0, NULL, NULL }

... 在 mathfns.c 中你可以这样做:

static struct queue_T primes_struct = EMPTY_QUEUE;
queue_T const primes = &primes_struct;

这样,如果您修改 struct queue_T,您可以对宏进行相应的更改,而不是修改源文件中仅 使用 该结构的任何代码.