Множественное определение статической переменной класса - PullRequest
0 голосов
/ 07 июня 2018

Я делаю задание по компилятору.Итак, у меня есть три файла.Файл 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

Ссылка на полный код:

Файл Flex

Файл зубров

SymbolTable

1 Ответ

0 голосов
/ 07 июня 2018

Если вы посмотрите, вы увидите, как оба файла .y и .l работают вместе .Вы увидите, как переменные, определенные в одной, помечены как extern в другой, и наоборот.Это потому, что оба выводят .c файлы.Если они оба содержат определение статической переменной, а затем скомпилированы и связаны, вы получите ошибку «множественное определение».

Чтобы исправить это, поместите инициализацию в только в один из двух файлов..

...