C++ C++;将代码拆分为多个文件的问题
因此,我正在进行一个项目,并决定将代码拆分为多个文件,因为它变得太大了。但是,a得到了一个编译错误。在这个简单的例子中,我成功地重现了错误: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
//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};