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)”模式下运行。

问:我运行了我的程序并获得了一个窗口,但没有输出。

您的病毒扫描程序或反恶意软件可能正在阻止执行。尝试暂时禁用它,看看是否是这个问题。

问:我的程序编译成功,但运行不正常。我该怎么办?

调试它!第 3 章后面有关于如何诊断和调试程序的提示。

一般编译时问题

问:当我编译程序时,收到关于未解析的外部符号 _main 或 _WinMain@16 的错误

这意味着您的编译器找不到您的 main() 函数。所有程序都必须包含 main() 函数。

有几件事需要检查
a) 您的代码是否包含名为 main 的函数?
b) main 拼写正确吗?
c) 当您编译程序时,您是否看到包含 main() 函数的文件被编译?如果没有,请将 main() 函数移动到已编译的文件中,或者将文件添加到您的项目中(有关如何执行此操作的更多信息,请参阅课程 2.8 -- 包含多个代码文件的程序)。
d) 您创建了控制台项目吗?尝试创建一个新的控制台项目。

问:当我编译我的程序时,我收到一个错误,提示 main 已经定义,或者关于 main 的多个定义

C++ 程序只允许有一个名为 main 的函数。您的 C++ 程序有多个。检查项目中的文件,并删除除一个之外的所有 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) :fatal error C1010: unexpected end of file while looking for precompiled header directive”

当 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: unresolved external symbol _WinMain@16 referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)”

您可能创建的是 Windows 图形应用程序而不是控制台应用程序。重新创建您的项目,并确保将其创建为 Windows (或 Win32) 控制台项目。

问:当我编译我的程序时,我收到一个关于“无法找到或打开 PDB 文件”的警告

这是一个警告,不是错误,所以它不应该影响您的程序。但是,它很烦人。要解决它,请进入“调试”菜单 -> “选项和设置” -> “符号”,并勾选“Microsoft 符号服务器”。

其他

问:我有一些其他问题,无法弄清楚。如何快速获得答案?

随着您学习材料的深入,您无疑会遇到问题或遇到意外的问题。接下来怎么做取决于您的问题。但总的来说,您可以尝试以下几件事。

首先,询问搜索引擎。找到一个好的方式来表达您的问题并进行搜索。如果您正在搜索错误消息,请使用引号粘贴精确的错误消息(排除任何文件名或行号)。很有可能有人已经问过相同的问题,并且有一个答案正在等待您。

其次,询问 AI,例如 通过 Bing 的 ChatGPT。以“在 C++ 中,”开始您的问题,以获得 C++ 特定的答案。一些您可以询问的想法

  • 对某个概念的解释(例如,“在 C++ 中,局部变量是什么?”)。
  • 两者之间的区别(例如,“在 C++ 中,指针和引用之间有什么区别?”)
  • 概念的演示(例如,“在 C++ 中,编写一个将两个数字相加的短程序”)

请注意,AI 可能会返回不准确或过时的信息,它们编写的程序可能不会遵循现代最佳实践。

如果以上方法失败,请在问答板上提问。有一些网站专为编程问题和答案设计,例如 Stack Overflow。尝试在那里发布您的问题。请记住详细说明您的问题是什么,并包含所有相关信息,例如您使用的操作系统和 IDE。

guest
您的电子邮箱地址将不会被显示
发现错误?请在上方留言!
与勘误相关的评论在处理后将被删除,以帮助减少混乱。感谢您帮助使网站对每个人都更好!
来自 https://gravatar.com/ 的头像与您提供的电子邮箱地址相关联。
有回复时通知我:  
431 评论
最新
最早 最多投票
内联反馈
查看所有评论