C++多文件编译时报错解决方案(.h.cpp.cpp)

问题一:声明与定义分离时报错

情况一:定义函数处的函数名不让过

C++多文件编译时报错解决方案(.h.cpp.cpp)_第1张图片

该情况是因为没有声明类域.cpp中的函数找不到对应的函数名

解决方案:

1、在前面声明类域以及命名空间(这里的mystring是自定义的命名空间)

在这里插入图片描述

.
2、放入命名空间里面(此时函数前面就不用声明命名空间了,但是函数名前面依旧需要加上类名)

C++多文件编译时报错解决方案(.h.cpp.cpp)_第2张图片

后续.cpp内容全都放在命名空间内部


情况二:定义函数处的参数不让过

C++多文件编译时报错解决方案(.h.cpp.cpp)_第3张图片

该情况是因为缺省参数同时用在了定义和声明的参数里面(C++不允许声明和定义同时给缺省参数)

解决方法:

1. 在定义里面去掉缺省参数(一般不会在声明的时候去除缺省)

C++多文件编译时报错解决方案(.h.cpp.cpp)_第4张图片


问题二:编译时因为头文件的位置而报错

在此之前,我们要先理解.h文件的特性

  1. 该文件属于头文件,不会被编译
  2. 如果.cpp文件包含了.h的头文件,那么在预处理阶段,会将他展开(把.h的内容全部复制一份进去)

情况一:在.cpp文件中包含了一些头文件后(如iostream、命名空间展开…),编译不让过

C++多文件编译时报错解决方案(.h.cpp.cpp)_第5张图片
C++多文件编译时报错解决方案(.h.cpp.cpp)_第6张图片

上述文件中:

  • .h文件没有包iostreamnamespace std
  • .cpp文件中包了iostreamnamespace std

该情况是因为:当 .h文件拷贝进 .cpp文件中后,h文件中的函数找不到其对应的命名空间

解决方法:

1. 更改 .cpp中头文件的包含次序

C++多文件编译时报错解决方案(.h.cpp.cpp)_第7张图片

因为对于包含进来的.h文件,他会向上去找匹配的条件。而在.h文件前面命名空间已经展开,所以能成功找到命名空间,就不会编译报错

2. .cpp文件中全部都不加任何除 .h之外的头文件,把那些头文件都放进 .h中,这样预处理的时候也就全部拿过来了

C++多文件编译时报错解决方案(.h.cpp.cpp)_第8张图片


问题三:其他的一些小问题

情况一:输入输出流重载的报错(静态、全局变量/函数的声明与定义)

报错如图,这种错误第一次见到都会无从下手

在这里插入图片描述

其实错误很简单,就是包含头文件的时候,如果头文件里面有全局、静态变量/函数,那么就会导致这个变量/函数会被每个 .cpp文件包含一次。这就导致在链接的时候,会发生重定义现象(上图fatal error LNK1169也表明了是在链接的时候出的错)

解决方法:

1. 将该变量/函数放入.cpp文件中

C++多文件编译时报错解决方案(.h.cpp.cpp)_第9张图片

提示:上图的范围for语句写的时候如果报错了,很有可能就是没有写迭代器,需要手动写一下迭代器。因为这个范围for会在编译的时候自动替换成迭代器


如上,就完成了对一些常见错误的处理
string类的一些接口的实现

你可能感兴趣的:(C++,c++,开发语言)