我正在使用Visual Studio在C中开发小项目。 为了避免多重包括我使用包含警卫。
我犯了很多错误,包括这一个:
file:collections.h
错误:C2061
说明:语法错误:标识符'终端'
synt_analysis.c
#include <string.h>
#include "headers\synt_analysis.h"
synt_analysis.h
#ifndef SYNT_ANALYSIS_H
#define SYNT_ANALYSIS_H
#include "collections.h"
typedef enum {
...
}TType;
typedef enum {
...
}NTType;
typedef struct {
TType type;
...
}Terminal;
void push_terminal(Terminal terminal, cStack *stack);
#endif
collections.h
#ifndef COLLECTIONS_H
#define COLLECTIONS_H
#include "synt_analysis.h"
typedef union {
int error;
Terminal terminal;
NTType nttype;
}cItemData;
typedef struct {
char *type;
cItemData content;
}cItem;
typedef struct {
unsigned cap;
unsigned used;
cItem *items;
}cStack;
#endif
集合提供cStack
,它可以存储由synt_analysis定义的Terminal
synt_analysis在函数cStack
中使用push_terminal
- 它会在堆栈上推送Terminal
。此函数用于减少所需的代码量(它创建新的Terminal
并将其推送到cStack
)。
答案 0 :(得分:2)
因为这个问题不能通过前向声明简单地解决(编译器需要知道不完整结构类型的大小 - 它被用作联合的一个选项),解决方案是创建另一个头文件,这将打破循环依赖。
新文件synt_structures.h
#ifndef SYNT_STRUCTURES_H
#define SYNT_STRUCTURES_H
#include "lex_analysis.h"
typedef enum {
...
}NTType;
typedef enum {
...
}TType;
typedef struct {
TType type;
...
}Terminal;
#endif
synt_analysis.h包括:
#include "collections.h"
#include "synt_structures.h"
collections.h包括:
#include "synt_structures.h"
这打破了周期。
答案 1 :(得分:0)
编辑:在这种情况下,以下实际上并没有解决问题,但我把它留在这里作为解决一些循环依赖的有用技术。
由于cStack
仅用作“synt_analysis.h”中指针类型的一部分,因此它可以是该头文件中的不完整类型。为了使其成为不完整的类型,您需要一个标签来引用它。
在“collections.h”中,将标记添加到struct
类型定义中使用的cStack
:
typedef struct cStack {
unsigned cap;
unsigned used;
cItem *items;
}cStack;
在“synt_analysis.h”中定义与不完整类型相同的类型:
typedef struct cStack cStack;
编辑:如上所述,这实际上并没有解决OP的问题。