函数错误的多重定义,即使使用#if guard子句也是如此

and*_*ndy 6 c++

我正在创建一个简单的UTIL.h文件包含我的C++项目的aplusb(int,int)函数.但是我无法编译,错误消息是关于`aplusb(int,int)'的多重定义.你能帮我纠正错误还是给我一些提示?

我附上了我的项目,供您参考.

文件UTIL.h

#ifndef UTIL_H_
#define UTIL_H_

int aplusb(int a, int b) {
    return a + b;
}

#endif /* UTIL_H_ */
Run Code Online (Sandbox Code Playgroud)

文件ClassA.h

#ifndef CLASSA_H_
#define CLASSA_H_

class ClassA {
public:
    ClassA();
    virtual ~ClassA();
private:
    int sum;
};

#endif /* CLASSA_H_ */
Run Code Online (Sandbox Code Playgroud)

文件ClassA.cpp

#include "ClassA.h"
#include "UTIL.h"

ClassA::ClassA() {
    // TODO Auto-generated constructor stub
    sum = aplusb(3,5);

}

ClassA::~ClassA() {
    // TODO Auto-generated destructor stub
}
Run Code Online (Sandbox Code Playgroud)

文件ClassB.h

#ifndef CLASSB_H_
#define CLASSB_H_

class ClassB {
public:
    ClassB();
    virtual ~ClassB();
private:
    int sum;
};

#endif /* CLASSB_H_ */
Run Code Online (Sandbox Code Playgroud)

文件ClassB.cpp

#include "ClassB.h"
#include "UTIL.h"

ClassB::ClassB() {
    // TODO Auto-generated constructor stub
    sum = aplusb(5,6);
}

ClassB::~ClassB() {
    // TODO Auto-generated destructor stub
}
Run Code Online (Sandbox Code Playgroud)

编译错误消息

ClassB.o: In function `aplusb(int, int)':
/home/vtvan/Desktop/workspace/commonfunc/UTIL.h:11: multiple definition of `aplusb(int, int)'
ClassA.o:/home/vtvan/Desktop/workspace/commonfunc/UTIL.h:11: first defined here
collect2: error: ld returned 1 exit status
make: *** [commonfunc] Error 1
Run Code Online (Sandbox Code Playgroud)

For*_*veR 17

第一个变体 - 使用inline说明符

#ifndef UTIL_H_
#define UTIL_H_

inline int aplusb(int a, int b) {
    return a + b;
}

#endif /* UTIL_H_ */
Run Code Online (Sandbox Code Playgroud)

第二个变体 - 在.cpp文件中写入定义.


Dev*_*lus 5

您在包含文件中创建了函数 aplusb。这意味着对于包含它的每个文件,都会创建一个公共函数 aplusb,从而导致名称冲突。

如果函数应该是内联的,则将其标记为内联。如果该函数应该是模板,则将其标记为模板。如果函数应该像您编写的那样,请将其放入 cpp 文件中,并将原型保留在 h 文件中。

.h
#ifndef UTIL_H_
#define UTIL_H_

int aplusb(int a, int b);

#endif

.cpp
int aplusb(int a, int b)
{
    return a+b;
}
Run Code Online (Sandbox Code Playgroud)