C++ 函数类宏的问题

C++ 函数类宏的问题,c++,c++11,macros,C++,C++11,Macros,我试图缩短bison解析器中的一些重复代码,下面是其中一条规则的摘录: expression : OBJECTID ASSIGN expression { $$ = std::make_shared<Assign>($1, $3); $$->setloc(@3.first_line, curr_filename); } | expression '.' OBJECTID '(' method_expr_list ')' { $$ = std::make_

我试图缩短bison解析器中的一些重复代码,下面是其中一条规则的摘录:

expression : OBJECTID ASSIGN expression { $$ = std::make_shared<Assign>($1, $3); $$->setloc(@3.first_line, curr_filename); }
            | expression '.' OBJECTID '(' method_expr_list ')' { $$ = std::make_shared<DynamicDispatch>($1, $3, $5); 
                                                                 $$->setloc(@1.first_line, curr_filename); }

不幸的是,我得到一个编译错误,说$$没有定义,这是有意义的,因为它是一个类似于宏的函数。我想知道是否有办法实现第二个代码段中的代码?

这是因为
$
是Bison识别和使用的特殊序列,它不在实际生成的C代码中。您必须将其作为参数传递给宏:

#define SETLOC(parent, node) parent->setloc((node).first_line, curr_filename)

如果您执行类似于
#定义SIGIL$$
的操作并使用
SIGIL->setloc(…)
,会发生什么情况?
#define SETLOC(node) $$->setloc((node).first_line, curr_filename)
#define SETLOC(parent, node) parent->setloc((node).first_line, curr_filename)