我在C ++中构建一个递归下降解析器,并试图在字符和字符串之间定义一个映射。但是,当我尝试编译时,我得到一个重复的符号错误。
以下是代码:
parser.h
#include <iostream>
#include <string>
#include <map>
#ifndef PARSER_H
#define PARSER_H
extern std::map<char, std::string> tokens;
class Parser {
public:
Parser();
private:
};
#endif
parser.cc
#include <string>
#include <map>
#include "parser.h"
std::map<char, std::string> tokens = {{'+', "PLUS"}, {'-', "MINUS"}, {'*', "STAR"}, {'/', "SLASH"}, {'(', "LPAR"}, {')', "RPAR"}};
Parser::Parser()
{
}
calculator.cc
#include <iostream>
#include "parser.h"
int main()
{
Parser RD_Parser;
return 0;
}
当我发出make时,我明白了:
g++ -Wall -Werror -std=c++11 -g parser.o calculator.o -o Calculator
duplicate symbol _tokens in:
parser.o
calculator.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Calculator] Error 1
我猜它与extern
定义有关,但我看过的例子与此非常相似。知道为什么在calculator.o
?
我正在使用clang 3.4.2。