[英]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.