假设我有一个C代码,它在C中有两个不同的声明。
struct pcdata
{
int x; int y;
};
int yyparse (struct pcdata *pp);
int yyparse (void *pp);
int yyparse (struct pcdata *pp)
{
}
用cc/gcc编译代码,我有conflicting types
错误。
test> cc -c hello.c
hello.c:7:5: error: conflicting types for 'yyparse'
int yyparse (void *pp);
^
hello.c:6:5: note: previous declaration is here
int yyparse (struct pcdata *pp);
^
1 error generated.
test> gcc -c hello.c
hello.c:7: error: conflicting types for ‘yyparse’
hello.c:6: error: previous declaration of ‘yyparse’ was here
g++没有错误,因为c++允许函数重载。
test> g++ -c hello.c
是否有允许函数重载的gcc选项?我有这个(简化的)代码与Bison 2.7生成的tab.c代码。
这在C中肯定不起作用,但应该没有必要。
bison通常创建一个完全不接受参数的yyparse
,但您可以使用%parse-param
声明(至少在不太旧的bison版本中)来告诉bison您希望它接受什么参数。
在所有情况下,只有一个yyparse
,除非您有两个单独的解析器编译到同一个程序中,当然,当您有多个语法需要解析时,就会发生这种情况。在这种情况下,您可以使用%name-prefix
来告诉bison,bison生成的解析器中的一个或两个应该使用yy
以外的前缀。
C没有函数重载。