编译失败指程序未生成可执行文件,运行失败指程序已生成但执行中出错;前者发生在代码翻译阶段,后者发生在程序加载执行阶段。

编译失败,程序根本不会生成;运行失败,程序已经跑起来了但中途出错。这是最核心的区分点。
编译阶段报错:程序压根没造出来
编译是把 .cpp 文件变成可执行文件(如 my_program.exe)的过程。只要这一步卡住,你就拿不到能双击或敲命令运行的东西。
- 典型错误信息里带
error:且出现在g++命令执行过程中,比如:error: ‘cout’ was not declared in this scope、error: expected ‘;’ before ‘}’ token - 常见原因:拼错函数名(
std::cout写成std::coutt)、漏分号、头文件没#include <iostream></iostream>、用了 C 风格的gcc编译 C++ 代码却没链接libstdc++ - 关键判断:命令行输入
g++ main.cpp -o main后没生成main.exe(Windows)或main(Linux/macOS),就说明编译没过
运行阶段报错:程序造出来了,但一动就崩
运行是把已生成的可执行文件加载进内存、交给 CPU 执行的过程。这时候错误不会出现在编译器输出里,而是程序启动后闪退、崩溃、输出异常,或者你用调试器看到 Segmentation fault、std::bad_alloc 这类提示。
- 典型现象:
g++ main.cpp -o main成功,接着运行main.exe突然弹窗报“已停止工作”,或终端打印Segmentation fault (core dumped) - 常见原因:访问了空指针(
int* p = nullptr; *p = 5;)、数组越界(int a[3]; a[5] = 1;)、除零(int x = 5 / 0;)、未初始化的局部变量被读取 - 注意:C++ 的
std::vector::at()在越界时会抛异常(运行期),而operator[]不检查——这也是为什么同样越界,一个会报错一个不会
怎么快速定位是编译还是运行问题
别猜,看命令行反馈和文件产出:
- 执行
g++ main.cpp -o main后,先确认当前目录下有没有生成main或main.exe。没有 → 编译问题 - 有可执行文件,但运行时崩溃或无输出 → 运行问题。此时可加
-g重新编译(g++ -g main.cpp -o main),再用gdb main启动,输入run看崩溃在哪一行 - 如果报错信息里出现
undefined reference to,这不是编译错,也不是运行错,是链接错——属于编译流程的最后一步,发生在多个.cpp文件一起编译时,比如声明了函数但没定义,或main.cpp调用了support.cpp里的函数却漏编译后者
最容易被忽略的是:有些错误看起来像运行时崩溃,其实是编译器没报,但行为未定义(UB),比如读未初始化的栈变量,它可能偶尔正常、偶尔崩,查起来特别费劲。这种必须靠静态分析工具(如 -fsanitize=undefined)或认真读标准来识别,不能只依赖“这次没崩”就认为没问题。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











