函数错误的多个定义,即使在使用#if-guard子句时也是如此 < >我正在创建一个简单的UTIL.H文件,其中包含了用于我的C++项目的APLUSB(int,int)函数。但是,我无法编译,错误消息是关于'aplubs(int,int')的多个定义。你能帮我纠正错误或给我一些提示吗

函数错误的多个定义,即使在使用#if-guard子句时也是如此 < >我正在创建一个简单的UTIL.H文件,其中包含了用于我的C++项目的APLUSB(int,int)函数。但是,我无法编译,错误消息是关于'aplubs(int,int')的多个定义。你能帮我纠正错误或给我一些提示吗,c++,C++,我在此附上我的项目供您详细参考 文件UTIL.h #ifndef UTIL_H_ #define UTIL_H_ int aplusb(int a, int b) { return a + b; } #endif /* UTIL_H_ */ #ifndef UTIL_H_ #define UTIL_H_ struct Util{ static int aplusb(int a, int b) { return a + b; } }; #endif

我在此附上我的项目供您详细参考

文件UTIL.h

#ifndef UTIL_H_
#define UTIL_H_

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

#endif /* UTIL_H_ */
#ifndef UTIL_H_
#define UTIL_H_

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

#endif /* UTIL_H_ */
文件ClassA.h

#ifndef CLASSA_H_
#define CLASSA_H_

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

#endif /* CLASSA_H_ */
文件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
}
#include "ClassA.h"
#include "UTIL.h"

ClassA::ClassA() {
    sum = Util::aplusb(3,5);
}

ClassA::~ClassA() {
}
文件ClassB.h

#ifndef CLASSB_H_
#define CLASSB_H_

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

#endif /* CLASSB_H_ */
文件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
}
#include "ClassB.h"
#include "UTIL.h"

ClassB::ClassB() {
    sum = Util::aplusb(5,6);
}

ClassB::~ClassB() {
}
编译错误消息

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

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

#ifndef UTIL_H_
#define UTIL_H_

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

#endif /* UTIL_H_ */

第二种变体——在代码> > CPP < /C>文件> .P/>

头文件不打算在其中具有实际功能(某些C++方面,如模板不可承受)。在您的情况下,一般做法是将UTIL.H更改为仅原型化函数(

intaplub(inta,intb);
)并将其实现移动到源文件。

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

如果函数应该是内联的,那么将其标记为内联。如果函数应该是模板,则将其标记为模板。如果函数应该与您编写的一样,请将其放入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;
}

您应该在头文件中声明APLUBS函数,并在cpp文件中提供定义。差不多

util.h:

#ifndef UTIL_H_
#define UTIL_H_

int aplusb(int, int);

#endif /* UTIL_H_ */
错误消息告诉您,每次包含util.h文件时,您都在重新定义函数,这正是您所做的:-)这违反了(一个定义规则),该规则规定(在本例中,函数的)定义必须是唯一的。否则,编译器将无法在备选方案之间进行选择(即使像在本例中一样,它们恰好相等)


请注意,模板使问题有点复杂(简而言之,因为模板在安装之前不是定义)。

您还可以创建一个Util结构,其中每个函数都声明为静态的。然后,您可以使用
Util::

文件UTIL.h

#ifndef UTIL_H_
#define UTIL_H_

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

#endif /* UTIL_H_ */
#ifndef UTIL_H_
#define UTIL_H_

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

#endif /* UTIL_H_ */
文件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
}
#include "ClassA.h"
#include "UTIL.h"

ClassA::ClassA() {
    sum = Util::aplusb(3,5);
}

ClassA::~ClassA() {
}
文件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
}
#include "ClassB.h"
#include "UTIL.h"

ClassB::ClassB() {
    sum = Util::aplusb(5,6);
}

ClassB::~ClassB() {
}

我很好奇为什么第二种变体是“正确的”,而第一种变体不是。内联此函数会有什么问题?但在这种情况下,为什么页眉防护装置不能工作?我认为头保护导致代码只执行一次。在本例中,这将只创建一次“int-aplubs(int,int)”函数定义。我很困惑。@lukasz1985一份声明。但没有一个定义。将函数放在头文件中是完全可以的,只要您将它们标记为内联。我的声明(如templates not Resisting)并不是要详尽地说明将函数放在头文件中是可以的所有情况。但碰巧模板与手头的情况无关,虽然有一种非常有效的方法可以在头文件中定义此函数。