我有一个检查点列表,然后运行一个函数。我最初是在该函数中构建此列表的,但现在我必须在外部构建它。问题是我不能在实现该功能的类中包含checkpoint.h
,因为checkpoint.h
返回该类类型的结构。初始列表在全局class.c
中声明。如何将外部创建的列表转移到类中以便可以使用?
所以我有这个标题,turing_machine.h
:
#ifndef __TURING_MACHINE__
#define __TURING_MACHINE__
#include "tape.h"
#include "alphabet.h"
#include "symbol_table.h"
...
#endif
和
checkpoint.h
标头定义checkpoint_list
类:#ifndef __CHECKPOINT_H__
#define __CHECKPOINT_H__
#include "turing_machine.h"
...
#endif
所以我想从
turing_machine.h
发送一个结构checkpoint
的列表,但是我不能修改任何东西,因为那是类必须保留的方式。我也有
turing_machine.c
:#include "turing_machine.h"
#include "checkpoint.h"
#include "symbol_table.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
checkpoint_list *c;
因此,一开始我在turing_machine中创建了该列表
c
,但是现在我必须在外部创建该列表,并且必须初始化该列表c
,但是我不知道如何。我希望这更加清楚。我把“类错误”一词用错了我只有
.c
和.h
文件。 最佳答案
在两句之间阅读时,我认为您的麻烦在于您具有“相互引用”的结构。
解决此问题的方法是使用不完整的类型定义:
typedef struct checkpoint_list checkpoint_list;
然后可以在
turing_machine.h
中使用它:#ifndef TURING_MACHINE_H_INCLUDED
#define TURING_MACHINE_H_INCLUDED
#include "tape.h"
#include "alphabet.h"
#include "symbol_table.h"
typedef struct checkpoint_list checkpoint_list;
typedef struct turing_machine
{
...
} turing_machine;
extern checkpoint_list *tm_function(turing_machine *);
extern turing_machine *tm_create(const char *);
#endif
而且,在
checkpoint.h
中,您可以编写:#ifndef CHECKPOINT_H_INCLUDED
#define CHECKPOINT_H_INCLUDED
#include "turing_machine.h"
/* No typedef here in checkpoint.h */
struct checkpoint_list
{
...
};
extern checkpoint_list *cp_function(const char *);
extern turing_machine *cp_machine(checkpoint_list *);
#endif
此技术已由C标准(C90,更不用说C99或C11)认可并定义了。
注意,我还重命名了包含卫士;以双下划线开头的名称保留用于“实现”(意味着C编译器及其库),因此您不应在自己的代码中使用这些名称。