我指的是stackoverflow post:
当我构建以下代码时,我得到:“架构x86_64的重复符号”。我一直在谷歌搜索过去几个小时,但没有找到任何帮助。有什么建议吗?
#ifndef __lexer__lexer__
#define __lexer__lexer__
#include <stdio.h>
#include <string>
namespace Tag{
const int AND = -1,
OR = -2;
}
class Token{
public:
std::string Name;
std::string Type;
std::string Value;
int Tag;
Token(std::string name, std::string type, std::string value, int tag){
Name = name;
Type = type;
Value = value;
Tag = tag;
}
};
class Word : public Token{
public:
Word(std::string name, std::string type, std::string value, int tag) : Token(name, type, value, tag){}
static const Word AND;
};
const Word Word::AND = *new Word("and", "logical", "&&", Tag::AND);
#endif /* defined(__lexer__lexer__) */
代码:
const Word Word::AND = *new Word("and", "logical", "&&", Tag::AND);
是什么给了我这些问题。
答案 0 :(得分:4)
简短的回答是你不想在.h文件中做定义(而不是声明)。当.h文件包含在多个其他文件中时,会出现错误。
稍微长一点的答案是你的*new
成语是不必要的,可能会浪费少量存储空间。
const Word Word::AND("and", "logical", "&&", Tag::AND);
将调用相同的构造函数。
更长的答案是Tag应该是枚举,而你不希望按值传递std :: string。也许你来自另一种语言:你需要学习通过引用传递和const引用。
答案 1 :(得分:2)
初始化代码属于.cc文件,而不是标题。在标题中,包含它的每个编译单元都会创建一个新的,然后链接器会正确地抱怨重复。