由于某种原因,即使我事先包含了.h
,联合中的结构指针似乎也没有定义。
%{
#include "agent.h"
.
.
.
%}
%union {int iValue; char sIndex; ASTnode *nPtr; litNode *litPtr; ruleNode *rulePtr; exprNode *expPtr; actNode *actPtr; conNode *conPtr};
.
.
.
%%
但是,在#include "agent.h"
下使用此类结构指针的函数定义可以正常工作。为什么会出现错误:
y.tab.h:58:15: error: unknown type name ‘ASTnode’
typedef union {int iValue; char sIndex; ASTnode *nPtr; litNode *litPtr; ruleNode *rulePtr; exprNode *expPtr; actNode *actPtr; conNode *conPtr} YYSTYPE;
^
y.tab.h:58:15: error: unknown type name ‘litNode’
y.tab.h:58:15: error: unknown type name ‘ruleNode’
y.tab.h:58:15: error: unknown type name ‘exprNode’
y.tab.h:58:15: error: unknown type name ‘actNode’
y.tab.h:58:15: error: unknown type name ‘conNode’
即使我已经包含了.h
文件?
我看到了有关此问题的其他问题,但是他们通过包含头文件解决了问题,但就我而言,它仍然无法正常工作。
谢谢。
答案 0 :(得分:1)
编译器抱怨一个未定义的类型(ASTnode
),您可能已将其定义为struct
,但没有定义为typedef
(在C ++中,结构会自动获得一个已定义的类型的名称相同,但在C语言中是不正确的,或者您在yacc的%union
句子中使用它时拼写错误。
该问题与yacc无关。您正在使用未在任何地方声明的类型。在标题中搜索类型ASTnode
的定义。可能您某处缺少typedef
。
类型相同
litNode
ruleNode
exprNode
actNode
conNode
这些类型是应用程序类型,必须在创建的union
类型中使用它们之前定义它们。它们很可能是在.h
文件中定义的,您必须在每个文件的开头包括生成的y.tab.h
和C部分(由%{
和%}
)授予编译器访问这些类型定义的权限。
答案 1 :(得分:0)
貌似,我必须在声明包含.h
之前包含y.tab.h
文件。因此,在调用.h
include "y.tab.h"
。