繁体   English   中英

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

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

我正在学习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头中的mathfns.h文件

谢谢。

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

据推测,函数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 ,并在任何地方使用它(包括在函数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 ,您可以对宏进行相应的更改,而不是修改仅使用该结构的源文件中的任何代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM