- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在学习 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/
我是一名优秀的程序员,十分优秀!