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

时间:2015-11-16 20:06:12

标签: c module global-variables

我正在学习C,我在做一些功课时遇到了一些麻烦。

我正在尝试使用一个链接列表,我已将其作为另一个标头内的一个标头的一部分实现。我对列表的实现包括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是与您在本段上方查看的源文件关联的头文件。当我尝试编译时,上面的queue_T变量声明默认为整数,当我尝试初始化变量时,它会产生错误。我怎么能避免这个?我应该#include queue.h文件中的&#34; mathfns.h标题

谢谢。

1 个答案:

答案 0 :(得分:3)

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

据推测,函数new_queue()都会分配一个新的struct queue_T并初始化它,然后返回一个指向调用者的指针。这很好,很有用,但是如果你只想初始化现有的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,并在任何地方使用它(包括函数{{1} ,以确保在任何地方执行相同的初始化)。因此,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; ,您可以对宏进行相应的更改,而不是修改只是使用该结构的源文件中的任何代码。

相关问题