2013-07-08 1 views
2

Допустим, у меня есть этот код на Си, который имеет два разных заявления в C.Разрешение функции перегрузки в C компилятором (Подавляя «конфликтующие типы для» Ошибка в C)

struct pcdata 
{ 
    int x; int y; 
}; 

int yyparse (struct pcdata *pp); 
int yyparse (void *pp); 

int yyparse (struct pcdata *pp) 
{ 

} 

Компиляция кода куб.см/ССАГПЗ, У меня есть 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.

+1

Зачем вам нужны 2 определения функций для 'yyparse()' –

+1

Если вы хотите функцию C++ для перегрузки функций, используйте C++ для компиляции кода. –

ответ

3

Это, безусловно, не будет работать на C, но это не обязательно.

bison обычно создает yyparse, который не принимает никаких аргументов, но вы можете использовать объявление %parse-param (по крайней мере, в версиях бизонов, которые не слишком стар), чтобы сообщить bison, какие аргументы вы хотите принять.

Во всех случаях есть только один yyparse, если у вас нет двух отдельных парсеров, скомпилированных в одну и ту же программу, что, конечно же, может случиться, когда у вас есть более одной грамматики, которая должна быть проанализирована. В этом случае вы можете использовать %name-prefix, чтобы сообщить бизону, что один или оба из парсеров, основанных на бизонах, должны использовать префикс, отличный от yy.

+0

На самом деле, у меня в этом что-то не так. Я добавил еще одно сообщение: http://stackoverflow.com/questions/17518961/parse-param-struct-pcdata-pp-issue-with-bison-2-7 – prosseek

2

C не имеет функции перегрузки.