函数式宏问题

时间:2012-08-16 23:20:46

标签: c++ c++11 macros

我正在尝试缩短我的野牛解析器中的一些重复代码,这里是其中一条规则的摘录:

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); }

我在考虑以下几点:

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

除了使用宏来执行此操作之外,我无法想到实现此目的的任何其他方法。这就是我想出的:

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

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

1 个答案:

答案 0 :(得分:0)

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

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