C VS循环依赖?错误C2061 - 标识符语法错误

时间:2016-11-23 09:31:18

标签: c visual-studio compiler-errors dependencies

我正在使用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)。

2 个答案:

答案 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的问题。