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

C++ Problems with splitting code into multiple files

本文关键字:文件 问题 代码 拆分 C++      更新时间:2023-10-16

因此,我正在处理一个项目,并决定将代码拆分为多个文件,因为它太大了。但是,a出现编译错误。我设法在这个简单的例子中重新创建了错误:

//main.cpp
#include<iostream>
#include "classa.h"
using namespace std;
int main()
{
    return 0;
}

主要什么都不做它只是包括classa.h

//classa.h
#ifndef CLASSA_H_INCLUDED
#define CLASSA_H_INCLUDED
#include<vector>
using namespace std;
vector<int> primes= {1,2,3,5,7,11,13,17,19};
class classa
{
private:
    int a;
public:
    int getA();
    void setA(int newA);
};
#endif //CLASSA_H_INCLUDED

该类甚至不是发生错误所必需的。然而,我想在classa.pp 中拥有一些东西

//classa.cpp
#include "classa.h"
using namespace std;
int classa::getA()
{
    return a;
}
void classa::setA(int newA)
{
    a=newA;
}

它给了我以下错误:

objDebugsourcesmain.o:main.cpp:(.bss+0x0): multiple definition of `primes'
objDebugsourcesclassa.o:classa.cpp:(.bss+0x0): first defined here

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

Make primes一个extern变量,并在classa.h头中声明它,但在classa.cpp中只定义了一次。

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

classa.h:

 extern std::vector<int> const primes;

classa.cp:

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

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

如果您有.cpp文件,那么拆分为是有意义的

Into.h文件:

extern std::vector<int> primes;

进入.cpp文件:

using namespace std;
vector<int> const primes = {1,2,3,5,7,11,13,17,19};

"使用命名空间std"可能会导致第三方库之间的冲突,但这种情况很少发生——我更喜欢尽可能使用"使用命名空间td"。但是,如果存在冲突,那么您可能希望将"使用命名空间std"本地化到自己的.cpp文件中。(在您控制该文件的#include的位置)。

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

__declspec(selectany) std::vector<int> primes = {1,2,3,5,7,11,13,17,19};

这将指示链接器只获取一个副本(其中一些副本),并丢弃其他所有副本。如果您想#ifdef进行一些初始化,这不会很好地发挥作用,但这无论如何都不是正常的用例。

我宁愿永远不要使用const,因为在2-3级转换后立即获得const总是很痛苦的。我在函数注释中写下什么是输入/什么是输出以及什么不应该修改。(因为它可以随迭代而改变)