c++ - 静态类变量的多重定义
问题描述
我正在对编译器进行分配。所以我有三个文件。一个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
完整代码链接:
解决方案
如果你看的话,你会看到 the.y
和.l
file是如何一起工作的。您将看到一个变量中定义的变量如何标记为extern
另一个变量,反之亦然。这是因为两个输出.c
文件。如果它们都包含静态变量定义,然后被编译和链接,则会出现“多重定义”错误。
要解决此问题,请将初始化仅放在两个文件之一中。
推荐阅读
- html - 按回车键后我无法更改页面
- vue.js - 如何将确认模式添加到 axios 删除
- java - 拨出电话时的媒体记录器故障
- mysql-workbench - MySql Workbench 插入模板参数快捷方式
- reactjs - 在 REACT 上安装 webpack 时出错:配置对象无效。Webpack 已使用配置对象初始化
- r - 嵌套 ifelse 函数中的 AND 运算符
- html - 在 CSS 中添加 CSS 类 OnHover
- c++ - QML/QT 如何将对象从 C++ 转换为 QML?
- tensorflow - 使用浏览器在图像中进行对象检测时出现 TensorFlow JS 错误
- database - Cassandra 中的一对多映射(Ecomerce 数据模式)