классы бизонов и пользователей: ошибка компиляции

Я пытаюсь создать игрушечный язык с простой грамматикой, используя C++, flex а также bison, У меня есть четыре файла: types.hpp, scanner.l, parser.y а также Makefile, Когда я пытаюсь скомпилировать, для каждой функции внутри types.hpp Л.Д. говорит, что это уже определено. Я думаю, что проблема в директивах включения. Вот что у меня есть в начале каждого файла (я опускаю содержание грамматики, потому что думаю, что это не причина; если возникнет необходимость, я опубликую его):

// scanner.l

%{
#include "parser.hpp"#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <string>
using namespace std;

extern "C" {
int yylex(void);
} /* extern "C" */

char BUFFER[32768];
int POSITION;

%}

%option noyywrap
%x COMMENT
%x BYTESMODE
%x indent
%s normal

// parser.y

%{
#include <iostream>
using namespace std;

extern "C" {
int yylex(void);
int yyparse(void);
int yywrap() { return 1; }
} /* extern "C" */

void yyerror(const char *error) {
cerr << error << endl;
} /* error handler */

%}

/*============================================================================*/
/* Create Bison union and stack */
/*============================================================================*/
%code requires {
#include "types.hpp"}

%union {
object_type* pointer;
type_type*   type_buffer;
none_type*   none_buffer;
bool_type*   bool_buffer;
int_type*    int_buffer;
float_type*  float_buffer;
bytes_type*  bytes_buffer;
} /* union */

// types.hpp

#include <iostream>
#include <typeinfo>
#include <sstream>
#include <string>
using namespace std;

//============================================================================//
// Declare classes
//============================================================================//
class object_type;
class none_type;
class type_type;
class bool_type;
class int_type;
class float_type;
class bytes_type;

type_type  type_function(object_type* object);
bytes_type name_function(object_type* object);
bytes_type repr_function(object_type* object);
bool_type  bool_function(object_type* object);
int_type   int_function(object_type* object);
float_type float_function(object_type* object);
bytes_type bytes_function(object_type* object);

// Makefile

caesar: scanner.l parser.y types.hpp
clear && clear && clear
bison -d parser.y -o parser.cpp --graph
flex -o scanner.cpp scanner.l
g++ -Wall -g -o $@ parser.cpp scanner.cpp -lfl

Где может быть ошибка? Я думаю, это тривиально, но, поскольку я новичок в C ++, мне довольно сложно его найти. Заранее спасибо! Если будет необходимость, я выложу весь код.

Вот пример сообщения об ошибке.

/home/ghostmansd/lang/types.hpp:559: multiple definition of `repr_function(object_type*)'
/tmp/ccv2zJdS.o:/home/ghostmansd/lang/types.hpp:559: first defined here

Repository: http://github.com/ghostmansd/caesar

0

Решение

Проблема в том, что у вас есть реализация в вашем заголовочном файле, например

type_type::~type_type(void) { /* destructor */ }

Это нужно перейти к types.cpp, в types.hpp у вас должно быть только определение класса (если вы не включите этот материал, но это будет второй шаг). Это связано с тем, что если types.hpp включается более одного раза, у вас также есть две реализации, которые не нравятся компоновщику.

Вы также не должны объявлять переменные в types.hpp.

1

Другие решения

Вы определяете константы в заголовочном файле:

const none_type NONE_TYPE;
const bool_type BOOL_TYPE;
const int_type INT_TYPE;
const float_type FLOAT_TYPE;
const bytes_type BYTES_TYPE;

Это вызывает проблемы при связывании, потому что одни и те же символы существуют несколько раз.

Один из способов избежать этой проблемы:

Вы должны только объявить их как внешние в заголовке:

extern const none_type NONE_TYPE;
extern const bool_type BOOL_TYPE;
extern const int_type INT_TYPE;
extern const float_type FLOAT_TYPE;
extern const bytes_type BYTES_TYPE;

И определить только в одном файле cpp:

const none_type NONE_TYPE;
const bool_type BOOL_TYPE;
const int_type INT_TYPE;
const float_type FLOAT_TYPE;
const bytes_type BYTES_TYPE;

Похоже, такие же проблемы возникают и с определениями функций заголовка.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector