编译时有多个定义

时间:2017-06-08 05:47:57

标签: c++ multiple-definition-error

我有这些文件:

main.cpp
headers.h
calculator.h
calculator.cpp
Supported_operators.h
Supported_operators.c
My_Operations.h
My_Operations.cpp

我的headers.h文件(除了std libs):#include "Supported_operators.h",最后我的Supported_operators.h包含以下内容:

#ifndef CALCULATOR_SUPPORTED_OPERATORS_H
#define CALCULATOR_SUPPORTED_OPERATORS_H

#include "headers.h"
//using directives
class Supported_operator {
//stuff
};

list<Supported_operator> supportedOps = {
                                        Supported_operator('+', 2, 'l'),
                                        Supported_operator('-', 2, 'l'),
                                        Supported_operator('*', 3, 'l'),
                                        Supported_operator('/', 3, 'l'),
                                        Supported_operator('^', 4, 'r')
                                        };

#endif //CALCULATOR_SUPPORTED_OPERATORS_H

当我尝试编译程序时,编译器在我的multiple definition of supportedOps[abi:cxx11]上说main()

如何解决这个问题?

背景:我正在尝试制作一个计算器。必须将string输入拆分为令牌。如果token是运算符,则根据该运算符执行某些操作。所以我必须创建一个SupportedOperator s的容器,然后检查是否支持tokened操作符以及它的属性。

编辑2:我的headers.h文件现在包含const list<Supported_operator> supportedOps;,而我的Supported_operators.cpp现在有list<Supported_operator> supportedOps = { };headers.h触发器错误list does not name a type

编辑3:现在将headers.h中的声明更改为extern const std::list<> supportedOps;会导致出现一组新错误 - Supported_operator未在该范围内声明。我以为我的#include "Supported_operators.h覆盖了Supported_operator。我是否正确地假设编译器不知道类Supported_operator了吗?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您应该在标题中留下list<Supported_operator> supportedOps;并添加

Supported_operator('+', 2, 'l'),
        Supported_operator('-', 2, 'l'),
        Supported_operator('*', 3, 'l'),
        Supported_operator('/', 3, 'l'),
        Supported_operator('^', 4, 'r')
        };

到您的supported_operators.c(pp)

答案 1 :(得分:0)

如果您不需要更改supportedOps,您还可以直接在变量前面添加const。

const list<Supported_operator> supportedOps = { }

这将通过ODR检查,因为所有翻译单元中的变量保证相同。