繁体   English   中英

联合c ++ yacc中的struct

[英]struct in union c++ yacc

我想在yacc文件中的联合中添加结构,但发现此错误:

“错误:在联合中不允许使用构造函数的成员'Info YYSTYPE :: info'成员”

%{
#include <cstdio>
#include <iostream>
using namespace std;

 extern "C" int yylex();                         
 extern "C" int yyparse();             
 extern "C" FILE *yyin;                
 struct Info{ int intval; float floatval; string stringval ;int type; } 

void yyerror(const char *s);
%}

%union {  

int ival;
float fval;
char *sval;

struct Info info;

}

您不能将非POD结构放入C ++的联合中,因为编译器无法告知要构造或销毁哪个联合成员。

一种替代方法是在联合中使用指针:

%union {
    ...
    Info *info;
};

在这种情况下,如果/不再需要指针,则需要谨慎地显式删除它们。 在有错误的情况下,Bison的%destructor可以用来避免泄漏。

或者,根本不使用%union ,只需将YYSTYPE定义为单个类型:

%{
#define YYSTYPE struct Info
%}

在这种情况下,所有规则都需要使用相同的类型(没有%type声明可以使不同的规则产生不同的结果)。 如果您确实需要其他类型,则boost::variant类的东西可能会很有用。

我看不到同时使用具有相同成员的联合和结构的意义。 您应该使用其中一个。

如果您告诉bison发出C ++解析器,则可以选择使用类似变体的语义类型。 无论是使用C还是C ++解析器,都可以使用并集或结构,但在两种情况下都不能(甚至间接地)将C ++ std::string包括为并集成员,正是出于该错误消息中指示的原因。 这与野牛无关。 除非联合本身具有构造函数,否则C ++不允许您使用具有构造函数的成员定义联合。 (a如果您尝试编写所需的构造函数,则可能会明白为什么该语言无法为您完成此工作。)

如果您不想弄乱内存管理,那么bison的variant选项可能适合您。 阅读手册中的文档。 否则,您可以使用指向std::string的指针(使用new运算符创建),也可以仅使用C字符串。 在这两种情况下,您都需要分配和释放存储。

联合只允许您使用基本类型和指针。

如果需要使用结构,则在联合中只能声明指向该结构的指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM