具有全局功能的hpp / cpp拆分:.的多重定义.错误

hpp/cpp split with global function: Multiple definition of ... error

本文关键字:错误 定义 拆分 全局 功能 hpp cpp      更新时间:2023-10-16

编辑:问题是被遗忘的包含保护。不好意思!

因此,我正在尝试应用两个文件规则,其中所有声明都进入 .hpp 文件,所有定义进入相应的.cpp文件。我的问题是库中的全局函数,其标头包含在多个位置。
例如:

/* lib1.hpp */
namespace lib1{
int addNumbers(int a, int b);
}

和 cpp 文件:

/* lib1.cpp */
namespace lib1{
int addNumbers(int a, int b) {return a + b;}
}

现在,如果我在多个库中包含lib1.hpp,例如lib2,lib3,然后在任何其他库或可执行文件中包含lib2和lib3

我收到addNumbers()错误的多个定义

这对我来说是有道理的,但我无法弄清楚如何解决这个问题。我尝试了extern关键字,但它没有改变任何东西:

/* lib1.hpp */
namespace lib1{
extern int addNumbers(int a, int b);
}

并且 cpp 文件保持不变:

/* lib1.cpp */
#include "lib1.hpp"
namespace lib1{
int addNumbers(int a, int b) {return a + b;}
}

如果我为 lib1.hpp 中的函数创建一个环绕类,它会起作用,但这无助于我理解问题并添加一个冗余命名空间,例如 lib1::lib1::addNumbers()

1.) 如果您的函数应该在头文件中定义,请添加内联关键字。

2.) 我认为以两个下划线开头的名称是为编译器保留的。

正如"Let Us Embed"所告诉使用预处理器指令以避免重复声明。

# pragma once ///if the compiler supports 

对于其他编译器,请使用:

#ifndef EXAMPLE
#define EXAMPLE
Add your code
#endif

尝试在 .hpp 文件中使用 #define,如下所示

/* lib1.hpp */
#ifndef __LIB_1__
#define __LIB_1__
namespace lib1{
int addNumbers(int a, int b);
}
#endif /*__LIB_1__*/