C++ C++;将代码拆分为多个文件的问题

C++ C++;将代码拆分为多个文件的问题,c++,compiler-errors,C++,Compiler Errors,因此,我正在进行一个项目,并决定将代码拆分为多个文件,因为它变得太大了。但是,a得到了一个编译错误。在这个简单的例子中,我成功地重现了错误: //main.cpp #include<iostream> #include "classa.h" using namespace std; int main() { return 0; } 它给了我以下错误: obj\Debug\sources\main.o:main.cpp:(.bss+0x0): multiple definit

因此,我正在进行一个项目,并决定将代码拆分为多个文件,因为它变得太大了。但是,a得到了一个编译错误。在这个简单的例子中,我成功地重现了错误:

//main.cpp
#include<iostream>
#include "classa.h"
using namespace std;
int main()
{
    return 0;
}
它给了我以下错误:

obj\Debug\sources\main.o:main.cpp:(.bss+0x0): multiple definition of `primes'
obj\Debug\sources\classa.o:classa.cpp:(.bss+0x0): first defined here

问题是,与我的项目不同,我不能为全局变量使用某种常量或定义,因为它们可以被不同的类修改。

将素数设置为
外部变量,并在
classa.h
标题中声明,但只在
classa.cpp
中定义一次

目前,正如编译器告诉您的那样,素数存在两次,在
main.cpp
classa.cpp
中。请记住,
#include
仅仅是文本替换

类别A.h:

 extern std::vector<int> const primes;
extern std::向量常量素数;
classa.cpp:

std::vector<int> const primes = {1,2,3,5,7,11,13,17,19};
向量常量素数={1,2,3,5,7,11,13,17,19};

阅读有关存储类说明符的更多信息。

如果您总体上有.cpp文件,那么将其拆分为

进入.h文件:

extern std::vector<int> primes;
extern标准::向量素数;
进入.cpp文件:

using namespace std;
vector<int> const primes = {1,2,3,5,7,11,13,17,19};
使用名称空间std;
向量常量素数={1,2,3,5,7,11,13,17,19};
“使用命名空间std”可能会导致第三方库之间发生冲突,但这种情况很少发生-我更喜欢尽可能使用“使用命名空间std”。但是如果存在冲突,那么您可能希望将“使用命名空间std”本地化到您自己的.cpp文件中。(您可以控制该文件包含的内容)

但有时您可能根本没有.cpp文件(例如,只有本地内联函数或模板类),然后您可以像这样初始化向量:

__declspec(selectany) std::vector<int> primes = {1,2,3,5,7,11,13,17,19};
向量素数={1,2,3,5,7,11,13,17,19}; 这将指示链接器仅获取一个副本(其中一些副本),并丢弃所有其他副本。如果您想定义一些初始化,这就不太合适,但无论如何,这不是正常的用例


我宁愿永远不使用const,因为在2-3级转换后获得const总是让人头疼。我在函数注释中写什么是输入/什么是输出,什么不应该修改。(因为它可以随着迭代而改变)

1。不要在这里使用
名称空间
,这是邪恶的。2.素数的向量应该是常量,而不是向量!当#元素固定时,
const数组[]
std::array const
似乎更好(在前一种情况下没有动态分配,没有#include)。如果元素的数量固定,为什么要使用
向量
?一个裸的或
std::array
可以避免不必要的动态分配(理论上的开销),在前一种情况下,还可以避免包含头。我同意,但这不是原始问题的一部分。
using namespace std;
vector<int> const primes = {1,2,3,5,7,11,13,17,19};
__declspec(selectany) std::vector<int> primes = {1,2,3,5,7,11,13,17,19};