[c++] 编译错误:fatal error C1001: 内部编译器错误
这个是比较棘手的,因为具体原因未知,可能性也多。
**强烈建议:**使用其他编译器编译一次,很可能可以得到错误原因!比如在windows环境,我们常用的是 vs自带的msvc,你可以尝试使用 mingw、clang;或者如果你的代码是支持跨端的,就可以复制项目到 linux/虚拟机 下用 gcc 编译看看。
下面我们来列举一些可能性。
头文件互相引用
比如说 A.h 里面 #include "B.h",然后 B.h 里面也 #include "A.h"
1: 第一个考虑的思路是把相关代码从 .h 迁移到 .cpp 中。
2: 如果是因为一些声明之类的导致了需要互相引用,用第一个方法迁移仍然是不行的。这时应当使用前置声明,然后移除 include 语句:
- 比如,假设 A.h :
...
# include "B.h"
class A {
B* data_ptr = nullptr;
};
- -
- B.h :
...
#include "A.h"
class B {
A* data_ptr = nullptr;
}
像上面这样的情况就可以在 A.h 中前置声明 class B; 然后直接删除 #include "B.h" 语句
这是在告诉编译器,有一个声明类叫做 B,如果在编译时遇到B这个符号就当成一个声明的类就好,然后等待后续的编译或链接再确定。因此就可以去除 #include "B.h" 语句,从而解决循环引用的问题。
改动后 A.h :
...
class B;
class A {
B* data_ptr = nullptr;
};
- B.h 不需要改动
变量访问权限定义有问题
- 最近遇到的就是这个,就是在给函数传参时,我写了这样一段代码:
#include <chrono>
void wow(std::chrono::seconds second) {
......
}
void hello(time_t num) {
wow(const std::chrono::seconds(num));
}
哈哈不知道你是否发现了问题,在hello() 里我们调用了wow(),但传参是创建变量时写了个const !!!就是这个导致了msvc编译失败了,我也是给gcc编译它才报出这个问题。
实际上还有类似于你在不当的位置使用了 类 的(protected/private)声明的变量或函数,或是static相关的一些访问权限问题。检查起来相当麻烦,所以最好还是放别的编译器跑一下看看。