为什么在包含标题时会出现多个定义错误?

时间:2018-04-24 18:21:49

标签: c++

我声明了一个Algebra.h文件,其中包含add()函数的声明:

#ifndef Algebra_
#define Algebra_

namespace Algebra{

int add(int x, int y);

}
#endif

然后我将add()实现为:

Algebra.cpp

#include "Algebra.h"

namespace Algebra{

int add(int x, int y){
  return x+y;
}

}

然后我有A和B类,其中包括Algebra.h

B.h

#ifndef B_
#define B_

#include "Algebra.h"
#include <iostream>

class B{
public:
  void func(int x, int y);
};

#endif

B.cpp

#include "B.h"

void B::func(int x, int y){
  int val =  Algebra::add(x,y);
  std::cout << "B : "<< val << std::endl;
}

A.H

#ifndef A_
#define A_

#include <iostream>

#include "Algebra.h"
#include "B.h"

class A{
public:
  void func(int x, int y);
};

#endif

A.cpp

#include "A.h"    

void A::func(int x, int y){
  int val =  Algebra::add(x,y);
  std::cout << "A : " << val << std::endl;
}

main.cpp

#include "A.h"
#include "B.h"
#include "Algebra.h"

int main(){
  A a;
  B b;
  a.func(3,4);
  b.func(3,4);
  int val = Algebra::add(3,4);
  std::cout << "main : " << val << std::endl;
}

我尝试使用

进行编译
  1. g++ A.cpp B.cpp main.cpp -o bin

  2. g++ A.cpp B.cpp Algebra.cpp main.cpp -o bin

  3. 我收到此错误:

      

    /tmp/ccBXhev4.o:在函数'Algebra :: add(int,int)'中:   main.cpp :(。text + 0x0):'Algebra :: add(int,int)'的多重定义   /tmp/ccfaCF5H.o:A.cpp:(.text+0x0):首先在这里定义collect2:错误:   ld返回1退出状态

    我甚至尝试在add()中内联Algebra函数,但仍然会收到错误。我也不想让代数成为一个班级。

    为什么即使我添加了代数头文件,也会出现多重定义错误,而且它没有定义,只是声明了?

0 个答案:

没有答案