2017-12-10 41 views
1

Flex 및 Bison을 사용하여 C에서 프로젝트를 수행하고 있지만 컴파일하는 동안 오류가 발생했습니다. A_Sintactico.yy에서 yyerror 서브의C, Flex 및 Bison : 오류 : 'yyerror'의 충돌 유형

A_Sintactico.yy:186:6: error: conflicting types for ‘yyerror’ 
In file included from A_Sintactico.yy:3:0: 
A_Lexico.l:15:8: note: previous declaration of ‘yyerror’ was here 
extern yyerror(char*); 
    ^

코드 : 여기

오류입니다 yyerror 서브의

void yyerror(char* mens){ 
    extern int numlin; 
    fprintf(stderr, "Error sintactico en la linea %i %s\n", numlin, mens); 
} 

코드 일어나고 무엇

extern yyerror(char*); 

A_Lexico.l

에서? 감사!

답변

1

올바른 선언은

void yyerror(const char* mens);

입니다 그리고 함수 정의는 동일해야합니다 :

void yyerror(const char* mens) { … }

extern이 필요하지 않습니다, 그것은 다치게하지 않지만. 그러나 리턴 타입은 의무 사항입니다.

인수를 const char*으로 변경하는 것은 필요하지 않지만 문자열 리터럴을 인수로 사용하여 yyerror을 호출 할 수 있기 때문에 적극 권장합니다.

+0

나는 당신의 솔루션을 시도하고 작동하지 않습니다 ... void yyerror (const char *); extern 문제를 제거하는 것은 동일하지만 함수를 변경하면 더 많은 문제가 발생합니다. – juanjo

+0

@juanjo : 선언과 정의가 동일해야합니다. 그들은 모두'void yyerror (const char * mens)'이어야합니다. 나는 그것을 명확하게하기 위해 답을 업데이트 할 것이다. – rici

0

extern 버전이 오래된 것처럼 보입니다. 묵시적 반환은 void이 아닌 경우 int입니다. 이 두 가지를 일관성있게 만들어야합니다.