gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:56:24 24 4
gpt4 key购买 nike

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

谢谢。

最佳答案

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

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

关于c - 如何将一个模块中的 typedef 结构用作另一个模块中的全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33743685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com