首页 > 解决方案 > 静态类变量的多重定义

问题描述

我正在对编译器进行分配。所以我有三个文件。一个SymbolInfo.h文件,一个parser.y文件,一个lex.l文件。

SymbolInfo.h文件:

<include files....>

using namespace std;

#ifndef SYMBOLINFO_H_
#define SYMBOLINFO_H_

<more code...>

class SymbolTable{
    static int id;
    int bucket;
    ScopeTable* parentScope;

    <constructors and methods....>
}

#endif /* SYMBOLINFO_H_ */

我需要初始化静态变量id。所以我首先尝试在.h文件中对其进行初始化:

int SymbolTable::id = 0;
#endif /* SYMBOLINFO_H_ */

然后当我尝试编译它但它给出了以下编译错误:

l.o:(.bss+0x28): multiple definition of `SymbolTable::id'
y.o:(.bss+0x0): first defined here
l.o:(.bss+0x30): multiple definition of `id'
y.o:(.bss+0x430): first defined here
collect2: error: ld returned 1 exit status
./script.sh: line 14: ./a.out: No such file or directory

所以我从.h文件中删除了初始化并将它们移动到.l文件.y中。

.y文件:

%{

<some include files>
#include "SymbolInfo.h"

int SymbolTable::id = 0;

#define YYSTYPE SymbolInfo*

using namespace std;

int yyparse(void);
int yylex(void);

extern FILE *yyin;
extern int line_count;

FILE *fp;
ofstream logout,errorout;

const int bucketSize = 10;
SymbolTable symbolTable(bucketSize); 

%}

.l文件:

%{

<some include files...>
#include "SymbolInfo.h"
int SymbolTable::id = 0;
#include "y.tab.h"

using namespace std;

int line_count = 1;
int TOTAL_ERROR = 0;

extern SymbolTable symbolTable;
extern FILE *yyin;
extern YYSTYPE yylval;
extern ofstream logout,errorout;

......
%}

但它仍然给出同样的错误,我不明白为什么。对不起,很长的帖子,但任何帮助将不胜感激。

script.sh编译命令文件:

bison -d -y -v parser.y
g++ -std=c++11 -w -c -o y.o y.tab.c
flex "Lexical Analyzer".l
g++ -std=c++11 -w -c -o l.o lex.yy.c
g++ -std=c++11 -o a.out y.o l.o -lfl -ly
./a.out

完整代码链接:

弹性文件

野牛文件

符号表

标签: c++bisonlex

解决方案


如果你看的话,你会看到 the.y.lfile是如何一起工作的。您将看到一个变量中定义的变量如何标记为extern另一个变量,反之亦然。这是因为两个输出.c文件。如果它们都包含静态变量定义,然后被编译和链接,则会出现“多重定义”错误。

要解决此问题,请将初始化放在两个文件之一中。


推荐阅读