簡體   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