0-8 一些常见的C++问题
在本节中,我们将探讨新手程序员极易遇到的常见问题。本文并非旨在全面罗列编译或运行时问题,而是提供解决基础问题的实用方案。若您认为还有其他问题值得补充,欢迎在下方评论区留言。
常见运行时问题
问:执行程序时,控制台窗口闪烁后立即关闭。
首先,请在程序顶部添加或确保存在以下代码行(Visual Studio用户请确保这些代码出现在#include “pch.h”或#include “stdafx.h”之后,若存在这些头文件):#include <iostream> #include <limits>其次,在 main() 函数末尾(紧接在 return 语句之前)添加以下代码:
std::cin.clear(); // reset any error flags std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore any characters in the input buffer until we find an enter character std::cin.get(); // get one more char from the user这将使程序在继续执行前等待用户按下任意键,从而在操作系统关闭控制台窗口前,为您提供检查程序输出的时间。
其他解决方案(如常被推荐的system(“pause”)方案)可能仅在特定操作系统上有效,应避免使用。
旧版Visual Studio在“带调试启动”(F5)模式下运行时可能不会暂停。请尝试切换至“不带调试启动”(Ctrl-F5)模式运行。
问:我运行程序后弹出窗口但没有输出。
可能是病毒扫描程序或反恶意软件阻止了程序执行。请尝试暂时禁用这些程序,看看是否解决问题。
问:我的程序能编译但运行不正常,该怎么办?
进行调试!第三章后续内容中有关于如何诊断和调试程序的技巧。
编译时常见问题
问:编译程序时出现未解析外部符号_main或_WinMain@16的错误
这表明编译器无法找到main()函数。所有程序都必须包含main()函数。
请检查以下事项:
a) 代码中是否包含名为main的函数?
b) main函数名称拼写是否正确?
c) 编译时是否看到包含 main() 函数的文件被编译?若未出现,请将 main() 函数移至可见文件中,或将该文件添加至项目(具体操作详见第 2.8 课——多代码文件程序)。
d) 是否创建了控制台项目?请尝试新建控制台项目。
问:编译程序时出现错误,提示 main 已被定义或存在多个 main 定义
C++ 程序仅允许存在一个名为 main 的函数。您的程序中存在多个 main 函数。请检查项目中的文件,保留唯一 main 函数并删除其余定义。
问:尝试使用 C++11/14/17/XX 特性时无法正常工作
若编译器版本过旧,可能不支持这些新特性。请升级编译器。
对于现代IDE/编译器,编译器可能默认采用旧版语言标准。第0.12课《配置编译器:选择语言标准》将讲解如何更改语言标准。
问:编译程序时报错,提示无法打开.exe文件进行写入
这意味着链接器尝试创建可执行文件但失败。可能原因包括:
- 最常见情况是.exe文件正在运行。运行中的可执行文件无法被覆盖。请关闭运行中的.exe文件后重新编译。
- 您的防病毒或恶意软件防护程序阻止了可执行文件的创建或替换。
- 该.exe文件已存在且因其他原因被锁定。尝试重启系统(强制释放所有锁定),然后重新编译。
在Visual Studio中,此错误对应LNK1168报错。
问:尝试使用 cin、cout 或 endl 时,编译器提示 cin、cout 或 endl 是“未声明的标识符”
首先,请确保在文件顶部附近包含以下行:#include <iostream>其次,确保每次使用 cin、cout 和 endl 时都添加前缀“std::”。例如:
std::cout << "Broccoli" << std::endl;如果此操作未能解决您的问题,可能是您的编译器版本过旧,或安装文件已损坏。请尝试重新安装编译器并/或升级至最新版本。
问:尝试使用 endl 结束打印行时,编译器提示 end1 是“未声明的标识符”
请确保您没有将 endl 中的字母 l(小写 L)误认为数字 1。endl 完全由字母组成。请确认您的编辑器使用的字体能清晰区分小写字母 L、大写字母 I 和数字 1。此外,在大多数非编程字体中,大写字母 O 和数字 0 也极易混淆。
Visual Studio 问题
问:使用 Microsoft Visual C++ 编译时,会出现 C1010 致命错误,错误信息类似于“c:\vcprojects\test.cpp(263) :致命错误 C1010: 在查找预编译头指令时遇到意外文件结尾”
此错误发生于 Microsoft Visual C++ 编译器启用预编译头功能时,但某个(或多个)C++ 代码文件未在首行添加 #include “stdafx.h” 或 #include “pch.h”。
建议解决方案是禁用预编译头功能,具体操作详见第 0.7 课——编译首个程序。
若需保留预编译头功能,请定位引发错误的文件(如上例中的test.cpp),在文件最顶部添加以下代码行:#include "pch.h"旧版本的Visual Studio使用“stdafx.h”而非“pch.h”,因此若pch.h无法解决问题,请尝试使用stdafx.h。
请注意,对于包含多个文件的程序,每个C++代码文件都需以该行开头。
问:Visual Studio 报错如下:“1MSVCRTD.lib(exe_winmain.obj) : error LNK2022: 未解析的外部符号 _WinMain@16 在函数 ”int __cdecl invoke_main(void)“ (?invoke_main@@YAHXZ) 中被引用”
您可能创建的是Windows图形应用程序而非控制台应用程序。请重新创建项目,并确保选择Windows(或Win32)控制台项目类型。
问:编译程序时收到“无法找到或打开PDB文件”警告
此为警告而非错误,不影响程序运行。但为消除该提示,请依次进入“调试”菜单 -> “选项和设置” -> ‘符号’,勾选“Microsoft符号服务器”选项。
其他问题
问:我遇到其他无法解决的问题,如何快速获得答案?
随着学习深入,您难免会遇到疑问或突发状况。具体应对方式取决于问题性质,但通常可尝试以下方法:
首先,尝试搜索引擎ask a search engine。精心构思问题表述后进行检索。若搜索错误信息,请用引号精确复制错误提示(排除文件名或行号)。很可能已有他人提出相同问题,答案正等待着你。
其次,通过必应询问ChatGPT等AIask an AI。问题开头添加“在C++中”可获得特定于C++的解答。可咨询的示例问题:
- 概念解释(如“C++中的局部变量是什么?”)
- 概念对比(如“C++中指针与引用的区别是什么?”)
- 概念演示(如“用C++编写一个简单程序实现两个数字相加”)
请注意:AI可能提供不准确或过时的信息,其生成的程序代码通常不符合现代最佳实践标准。
若上述方法无效,请转至问答平台求助ask on a Q&A board。存在专门处理编程问题的网站(如Stack Overflow),建议在此发布问题。提问时务必详尽描述问题核心,并附上操作系统、开发环境等全部相关信息。

浙公网安备 33010602011771号