我正在学习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
标题
谢谢。
答案 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;
,您可以对宏进行相应的更改,而不是修改只是使用该结构的源文件中的任何代码。