静态类变量的多重定义
Multiple definition of static class variable
我正在做编译器的作业。所以我有三个文件。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
链接到完整代码:
弹性文件
野牛文件
符号表
如果你看一下,你会看到.y
和.l
文件是如何协同工作的。您将看到一个变量中定义的变量如何在另一个中标记为extern
变量,反之亦然。这是因为输出.c
文件。如果它们都包含静态变量定义,然后被编译和链接,则会出现"多重定义"错误。
要解决此问题,请仅将初始化放在两个文件中的一个中。
相关文章:
- 如何在基类中定义静态接口,并确保该接口必须在派生类中实现
- 静态指针指向这个为mock for googletest定义的类内部
- C++类中定义静态对象
- 如何从具有专用化的类模板定义静态成员变量?
- 静态类变量的多重定义
- 具有静态模板类成员的模板类:如何定义静态成员
- 定义静态类字段时多个已定义符号的链接器错误
- 我可以在类头文件中定义一个类的const静态实例吗
- 我们可以在构造函数中定义静态类成员吗?
- 在模板类中定义模板类的静态数据成员
- 如何定义模板类专业化的静态constexpr数组成员
- 必须定义所有静态类方法,即使不使用
- 我如何防止静态类成员变量需要两个定义/声明
- 在类外部定义静态匿名枚举
- 在类声明中定义静态变量时未解析的外部符号
- 与正在定义的类类型相同的静态 constexpr 成员
- 为什么重载运算符不能定义为类的静态成员
- 我可以在同一个.CPP文件中声明和定义静态类变量吗
- 定义静态类函数
- 在另一个命名空间内定义静态类成员