Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 联合中的结构指针_C_Pointers_Structure_Union_Yacc - Fatal编程技术网

C 联合中的结构指针

C 联合中的结构指针,c,pointers,structure,union,yacc,C,Pointers,Structure,Union,Yacc,出于某种原因,联合中的结构指针似乎没有定义,即使我事先包含了.h %{ #include "agent.h" . . . %} %union {int iValue; char sIndex; ASTnode *nPtr; litNode *litPtr; ruleNode *rulePtr; exprNode *expPtr; actNode *actPtr; conNode *conPtr}; . . . %% 但是,在下使用这种结构指针的函数定义包括“agent.h”可以正常工作。为什么

出于某种原因,联合中的结构指针似乎没有定义,即使我事先包含了
.h

%{
#include "agent.h"
.
.
.
%}
%union {int iValue; char sIndex; ASTnode *nPtr; litNode *litPtr; ruleNode *rulePtr; exprNode *expPtr; actNode *actPtr; conNode *conPtr};
.
.
.
%%
但是,在
下使用这种结构指针的函数定义包括“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
文件

我已经看到了关于这个问题的其他问题,但是他们通过包含头文件解决了这个问题,但是对于我来说,它仍然不起作用


谢谢。

看来,在声明include
y.tab.h
之前,我必须包含
.h
文件。因此,我还必须在Lex文件中包含
.h
,在调用
include“y.tab.h”
之前,编译器正在抱怨未定义的类型(
ASTnode
),您可能已经将其定义为
结构,但没有定义为
typedef
(在C++中,Stutt自动得到一个同名的类型,但在C中不是真的),或者在YACC <<代码> %Ung//>语句中使用它时,您已经忽略了它。 该问题与yacc无关。您使用的类型未在任何位置声明。请在标题中搜索类型
ASTnode
的定义。您可能缺少
typedef

这同样适用于类型

  • litNode
  • ruleNode
  • exprNode
  • actNode
  • conNode

这些类型是应用程序类型,在创建的
union
类型中使用它们之前必须定义它们。它们很可能是在
.h
文件中定义的,您必须在每个文件的开头包含生成的
y.tab.h
和C部分(被
%包围的部分){
%}
)赋予编译器访问这些类型定义的权限。

请参阅块,这些块也会复制到生成的头文件中。请不要发布仅显示
yacc(1)的一般结构的代码片段
源文件。假设在此论坛中收听的用户知道
yacc(1)的结构
文件,更好地格式化内部定义的
联合体的结构,因为很难从错误消息中识别任何内容,因为所有内容都在同一行。顺便说一句,显示类型
ASTnode
的定义,因为错误表明该类型未在任何地方定义,并且您不会对类型。除了没有显示任何内容的文件
agent.h
,他似乎没有包含任何内容。编译器消息抱怨未定义的类型
ASTnode
,该类型可能没有在任何地方被
typedef
,或者是错误的。
y.tab.h
可能根本不需要(在生成的
y.tab.c
文件中不需要它)