梅冠华-2019-05-22 翻译自C++学习网站 learncpp(www.learncpp.com) 第0章 第8节 https://www.learncpp.com/cpp-tutorial/a-few-common-cpp-problems/
这一节中,我们将列出一些常见的问题,它们是编程新手最有可能碰到的问题。这不是说要提供一个编译或执行问题的详尽清单,而是说对于基础问题的实用解决方案列表。如果你对于其它问题有任何建议,可以添加到该列表中来,那么请把它们公布到下面的评论区里。
Q:当程序运行时,控制台窗口闪了下瞬间就关掉了
首先,添加或是确保如下行代码是在你程序的最上部(Visual Studio用户,确保这些行出现在 #include “pch.h” 或 #include "stdafx.h"后面,如果有的话):
#include <iostream> #include <limits>然后,在mian()函数的最后添加如下代码(刚好就在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也许不会暂停,当程序是运行在Start With Debugging (F5) 模式下的时候。试着运行下Start Without Debugging (ctrl-F5)模式。
Q:我运行了我的程序,有一个窗口但是没有输出。
你的反病毒或反恶意软件也可能阻断程序的执行,试着暂时关闭你的扫描器看看问题是否解决了。
Q:我的程序编译好了但是它不正常工作,咋整?
Debug(纠错)它啊!在第1或2章有内容专门讲如何诊断和纠错你的程序。
Q:当我编译我的程序时,我碰到了一个错误提示unresolved external symbol _main or _WinMain@16
它的意思是你的编译器没找到你的main()函数。所有的程序必须有一个main()函数的。
你需要检查如下事项: a)你的代码里面有没有包含一个名为main的函数? b)main是不是拼写正确了? c)当你编译你的程序时,你是否看到包含函数main()的文件编译了?如果没有的话,要么把main()函数移动到可编译的文件里,要么把那个文件(包含main()函数的文件)添加到你的工程里(参考2.8节–多代码文件编程,来获取更多信息)。 d)你创建console工程了么?试着创建一个新的console工程。
Q:我试着使用C++11/14/17/XX功能但它不起作用
如果你的编译器是老的,它也许并不支持这些近来添加的功能。如果那样的话,更新你的编译器。
或者说,你可以试着看看是否你的编译器是支持这些的,只是它被默认关闭掉了。对于GCC/G++,你可以试着给编译器传递标识 -std=C++11、-std=c++14、或者 -std=c++17。对于Code::Blocks,确保全局编译器设置是合理的。我们在0.6节 – 安装一个集成开发环境中已经讲了怎么做这事儿。
Q:当使用cin、cout、或者endl时,编译器说cin, cout, or endl 是‘未声明的标识符’( ‘undeclared identifier’)
首先,确保你已经在你的文件最上端包含了如下行信息:
#include <iostream>其次,确保每个使用的cin、cout、和endl前面都有“std::”,例如:
std::cout << "Hello world!" << std::endl;如果这也无济于事的话,那么也许是你的编译器过时了,或者安装崩溃了。试着重新安装和/或更新你的编译器到最新版本。
Q:当尝试使用endl来终止输出行的时候,编译器说end1是‘未声明的标识符’( ‘undeclared identifier’)
确保你没有把在endl中的字母l(小写L)错搞成了数字1。endl全是字母。确保你的编译器使用的字体能够清晰地区分小写字母L、大写字母i、以及数字1。还有大写字母o以及数字0也非常容易混淆,尤其是对于不适用于编程的字体而言。
Q:当用微软的Visual C++编译时,碰到了C1010致命错误,报错信息是“c:\vcprojects\test.cpp(263) :fatal error C1010: unexpected end of file while looking for precompiled header directive”
这个错误发生的原因是,Microsoft Visual C++编译器被设置成了使用precomplied headers,但是你的C++代码中的一个(或者多个)文件并没有把 #include 或者 #include “pch.h” 作为代码文件的第一行。
我们建议的解决方法是关闭precomplied headers,在0.7节 – 编译你的首个程序中已经讲过了。
如果你偏好保留开启precomplied headers,那么修复该问题的方法也很简单,只要找到产生错误的文件(在上面的错误信息中,test.cpp是罪魁祸首了),并且添加如下行到文件最顶部就好:
#include "pch.h"Visual Studio较老的版本会使用“stdafx.h”而非“pch.h”,所以如果pch.h无济于事的话,试试stdafx.h。
注意对于有多个文件的程序,每个C++代码都需要用该行作为开头。
所以说嘛,直接关掉precompiled headers就好了。
Q:Visual Studio给出了如下错误“1MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function “int __cdecl invoke_main(void)”(?invoke_main@@YAHXZ)”
你很有可能是创建了一个窗口图形应用(Windows graphical application)而非控制台应用(console application)。重新创建你的工程,并且保证将其创建为Windows(或Win32)Console project。
Q:当我编译我的程序时,我得到了警告信息“Cannot find or open the PDB file”(无法找到活打开PDB文件)
这是一个警告,而非错误,所以其不会影响你的程序。然而,它挺恼人的。若要修复它,采用Debug menu -> Options and Settings -> Symbols,勾选Microsoft Symbol Server。
Q:我碰到其他的问题,我也没办法弄好,我该怎么快速找到答案呢?
当你把我们的材料详细看过后,毫无疑问,你还是会有问题或是碰到运行的未知问题。那么怎么办呢?这依据你的问题而定啊,但一般而言,你可以尝试如下操作。
首先,问Google啊。找到较好的方式来表达你的问题,进行Google搜索。如果你收到了错误信息,将这些信息用引号粘贴到google中。有可能别人也碰到了同样的问题,而且给你准备好了答案哦。
如果没有奏效的话,在Q&A模块去提问吧。有网站专门设计来做编程提问和回答的,像是Stack Overflow(栈上溢)。试着把你的问题公布出去,记住要透彻阐明你的问题是什么,并且包含所有相关的信息,比如你用的什么操作系统,你用的什么IDE。
梅冠华-2019-05-22 翻译自C++学习网站 learncpp(www.learncpp.com) 第0章 第8节 https://www.learncpp.com/cpp-tutorial/a-few-common-cpp-problems/