常见的C++问题

在本节中,我们将讨论新程序员似乎以相当高的概率遇到的一些常见问题。这不是一个全面的编译或执行问题列表,而是一份针对非常基本问题的实用解决方案列表。如果您有其他问题的建议,可以添加到此列表中,请在下面的评论部分发布。

一般运行时问题

控制台窗口闪烁问题

Q: 执行程序时,控制台窗口闪烁然后立即关闭。 首先,添加或确保以下几行代码位于您的程序顶部(Visual Studio用户,请确保这些行出现在#include “pch.h"或#include “stdafx.h"之后,如果这些文件存在):

#include <iostream>
#include <limits>

其次,在您的main()函数末尾(在return语句之前)添加以下代码:

std::cin.clear(); // 重置任何错误标志
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 忽略输入缓冲区中的任何字符,直到我们找到一个回车字符
std::cin.get(); // 从用户那里再获取一个字符

这将使您的程序在继续之前等待用户按下一个键,这将给您时间检查程序的输出,然后操作系统关闭控制台窗口。 其他解决方案,如通常建议的system(“pause”)解决方案可能只在某些操作系统上工作,应该避免。 较旧版本的Visual Studio在以"开始调试”(F5)模式运行程序时可能不会暂停。尝试以"不调试开始”(Ctrl-F5)模式运行。

无输出问题

Q: 我运行了我的程序,得到了一个窗口但没有输出。 您的病毒扫描器或反恶意软件可能正在阻止执行。尝试暂时禁用它,看看是否是问题所在。

程序不正确运行

Q: 我的程序编译了,但它没有正确工作。我该怎么办? 调试它!第3章后面有关于如何诊断和调试程序的提示。

一般编译时问题

main函数问题

Q: 当我编译我的程序时,我得到了一个关于未解析的外部符号_main或_WinMain@16的错误 这意味着您的编译器找不到您的main()函数。所有程序都必须包含一个main()函数。 有几件事需要检查: a) 您的代码是否包含一个名为main的函数? b) main的拼写是否正确? c) 当您编译程序时,是否看到包含main()函数的文件被编译?如果没有,要么将main()函数移动到一个被编译的文件中,要么将文件添加到您的项目中(有关如何做到这一点的更多信息,请参见第2.8课——具有多个代码文件的程序)。 d) 您是否创建了一个控制台项目?尝试创建一个新的控制台项目。

多个main函数

Q: 当我编译我的程序时,我得到了一个错误,说main已经定义了,或者关于main的多个定义 一个C++程序只允许有一个名为main的函数。您的C++程序有多个。检查项目中的文件,并删除除一个之外的所有main函数。

C++标准兼容性问题

Q: 我尝试使用C++11/14/17/XX功能,但它不起作用 如果您的编译器较旧,它可能不支持这些更近期的语言添加。在这种情况下,升级您的编译器。 对于现代IDE/编译器,您的编译器可能默认使用较旧的语言标准。我们在第0.12课——配置您的编译器:选择语言标准中介绍了如何更改您的语言标准。

可执行文件写入问题

Q: 当我编译我的程序时,我得到了一个错误,说它无法打开.exe文件进行写入 这意味着链接器试图创建您的可执行文件,但它不能。这可能发生的原因有很多:

最常见的是,.exe文件目前正在运行。正在运行的可执行文件不能被替换。关闭正在运行的.exe文件,然后重新编译。

您的防病毒或恶意软件保护正在阻止创建或替换可执行文件。

.exe文件已经存在,并且由于其他原因当前被锁定。尝试重新启动(以强制释放任何锁定),然后重新编译。

在Visual Studio中,这是错误LNK1168。

标准库问题

Q: 当尝试使用cin、cout或endl时,编译器说cin、cout或endl是"未声明的标识符" 首先,确保您在文件顶部附近包含了以下行:

#include <iostream>

其次,确保每次使用cin、cout和endl都加上"std::“前缀。例如:

std::cout << "Broccoli" << std::endl;

如果这没有解决您的问题,那么可能是您的编译器过时了,或者安装被损坏了。尝试重新安装和/或升级到您编译器的最新版本。

常见拼写错误

Q: 当尝试使用endl结束打印行时,编译器说end1是"未声明的标识符” 确保您没有将endl中的字母l(小写L)误认为是数字1。endl全部是字母。确保您的编辑器使用的字体清晰地区分小写字母L、大写字母i和数字1。同样,字母大写o和数字零在许多非编程字体中也容易混淆。

Visual Studio问题

预编译头文件问题

Q: 使用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++代码文件都需要以这行开始。

项目类型问题

Q: Visual Studio给出一个错误,如:“1MSVCRTD.lib(exe_winmain.obj) :错误LNK2022:在函数"int __cdecl invoke_main(void)"(?invoke_main@@YAHXZ)中引用的外部符号_WinMain@16未解析” 您可能创建了一个Windows图形应用程序,而不是控制台应用程序。重新创建您的项目,并确保将其创建为Windows(或Win32)控制台项目。

PDB文件警告

Q: 当我编译我的程序时,我得到了一个关于"无法找到或打开PDB文件"的警告 这是一个警告,不是错误,所以它不应该影响您的程序。然而,这很烦人。要解决这个问题,请进入"调试"菜单->“选项和设置”->“符号”,并勾选"Microsoft符号服务器”。

其他问题

获取帮助的方法

Q: 我有其他问题,我无法弄清楚。我怎样才能快速得到答案? 当您学习材料时,无疑会有问题或遇到意外的问题。接下来要做什么取决于您的问题。但一般来说,有一些事情您可以尝试。 首先,问搜索引擎。找到一个好的提问方式并进行搜索。如果您正在搜索一个错误消息,请使用引号粘贴确切的错误消息(排除任何文件名或行号)。可能已经有人问过相同的问题,有一个答案在等您。 其次,向像Bing上的ChatGPT这样的AI提问。以"在C++中,“开始您的问题,以获得特定的C++答案。您可以要求的一些事情的想法:

对某个概念的解释(例如,“在C++中,什么是局部变量?")。

两件事之间的区别(例如,“在C++中,指针和引用之间有什么区别?")

概念的演示(例如,“在C++中,编写一个简短的程序,将两个数字相加”)

请注意,AI可能会返回不准确或过时的信息,他们编写的程序可能不会遵循现代最佳实践。 如果上述失败,请在问答板上提问。有专门用于编程问题和答案的网站,如Stack Overflow。尝试在那里发布您的问题。记得详细说明您的问题,并包括所有相关信息,如您使用的操作系统和您使用的IDE。

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"