0

C++我正在尝试使用,flex和创建具有简单语法的玩具语言bison。我有四个文件:types.hppscanner.l和. 当我试图编译时,对于ld 中的每个函数来说,它已经被定义了。我猜这个问题出在包含指令中。这是我在每个文件开头的内容(我省略了语法内容,因为我认为这不是原因;如果有需要,我会发布它):parser.yMakefiletypes.hpp

// 扫描仪.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

// 解析器.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 */

// 类型.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);

// 生成文件

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

存储库:http: //github.com/ghostmansd/caesar

4

2 回答 2

1

问题是你的头文件中有实现,例如

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

这需要转到 types.cpp,在 types.hpp 中你应该只有类定义(除非你内联那些东西,但这将是第二步)。这是因为如果 types.hpp 被多次包含,那么您还会有两个实现,这是链接器不喜欢的。

您也不应该在 types.hpp 中声明变量。

于 2012-12-23T20:25:51.347 回答
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;

标题的函数定义似乎也出现了同样的问题。

于 2012-12-23T20:28:54.663 回答