C++ Include in main和class body返回多个定义错误

C++ Include in main和class body返回多个定义错误,c++,class,main,C++,Class,Main,我试图编译一个包含类头的主函数。主函数和类cxx文件都使用名为“SayHello”的助手函数。但是,如果在主文件和类cxx文件中包含帮助文件“Hello.h”,则会出现多定义错误。我在下面列举了一些例子。你能帮我吗 干杯, 安德烈亚斯 Main.cxx: #include "Class.h" #include "Hello.h" int main(int argc, char **argv){ SayHello(); return 0; } h班 #ifndef CLASS_

我试图编译一个包含类头的主函数。主函数和类cxx文件都使用名为“SayHello”的助手函数。但是,如果在主文件和类cxx文件中包含帮助文件“Hello.h”,则会出现多定义错误。我在下面列举了一些例子。你能帮我吗

干杯, 安德烈亚斯

Main.cxx:

#include "Class.h"
#include "Hello.h"

int main(int argc, char **argv){
    SayHello();
    return 0;
}
h班

#ifndef CLASS_H
#define CLASS_H

class Class {
public:
    Class();
    ~Class();
};

#endif
Class.cxx

#include "Class.h"
// #include "Hello.h" //with this it breaks!

Class::Class(){
    // SayHello(); //with this it breaks!
}
你好,h

#ifndef HELLO_C
#define HELLO_C

#include <iostream>

void SayHello(){
  std::cout<<"hello!"<<std::endl;
}

#endif
\ifndef HELLO\u C
#定义HELLO\u C
#包括
void SayHello(){

std::cout您将
SayHello
函数的定义放在头文件中。这是错误的

由于您将此头文件包含在两个不同的文件中,因此此定义将在两个不同的文件中编译两次,并且您的链接器最终会在末尾看到同一函数的两个定义

这就是为什么头文件Hello.h应该只包含函数的原型:

#ifndef HELLO_C
#define HELLO_C

void SayHello();

#endif
虽然定义应位于单独的Hello.cxx文件中:

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

void SayHello(){
  std::cout<<"hello!"<<std::endl;
}

更新: 如上所述,您也可以通过在标题中添加
inline
关键字来简单地将函数声明为inline。这将使编译器在每次调用此函数时复制整个函数内容,而不是执行函数调用

这通常用于非常短的函数,通常是getter和setter函数。由于您的函数只是一个“Hello”打印,因此将其设置为内联函数可能不是一个坏的做法


但要小心:代码中太多的内联函数会减慢编译速度,并增加包含依赖项。例如,如果内联
SayHello
函数,则任何包含
“Hello.h”的文件
还应包括

创建
hello.h
hello.cpp
,并将“sayHello”的声明和定义分开与你的类相同的方式,因为这是C++,定义SayHello函数为<代码>内联。谢谢大家!我是新来的,所以我现在看到了你的回复,可能没有相应的投票和东西。我会学习的!干杯!注意你在Hello中包含的守护程序。H应该被命名为代码“Hel.”LO_H
而不是
HELLO_C
。事实上,我找到了另一种方法,可以避免使用两个文件,即简单地将void SayHello()替换为内联静态void SayHello()。这是一种不好的做法吗?我怀疑在将函数测量为性能瓶颈之前内联函数是否是一种好的做法。
#include <iostream>
#include "Hello.h"

void SayHello(){
  std::cout<<"hello!"<<std::endl;
}
OBJS = Main.o Class.o Hello.o