我正在上一门课程,但讲师说的东西不起作用
I'm doing a course but the things the lecturer says works don't
我最近开始学习编程,并决定学习C++。我利用Udemy的销售机会,在那里买了三门课程,一门是C++初学者课程,一个是游戏制作课程,另一门是Blender课程。
我开始为初学者做这门课程,讲师说他会使用Code::Blocks,但任何其他IDE都可以,所以我下载了Visual Studio 2017,因为这就是游戏制作课程所使用的。但是,当我完全按照讲师说的(和写的)做时,代码就不会正确编译。
这里有一个例子:
讲师写了什么并开始在他的电脑上工作
#include <iostream>
using namespace std;
main()
{
cout << "Hello world! :-)";
}
在谷歌上搜索后,我发现它会起作用
#include <pch.h>
#include <iostream>
using std::cout;
int main()
{
cout << "Hello world! :-)";
}
我想问那些有经验的人:Code::Blocks和Visual Studio 2017之间有什么区别?在这种情况下有什么不同?我能用这门课学习吗?
提前感谢!
edit:在讲师代码中的一个缺失#中编辑
-
#include <pch.h>
:
见Gabriel的回答。 -
include <iostream>
与#include <iostream>
:
前者完全错误。它必须是#include
和#
。 -
using namespace std;
与using std::cout;
:
虽然两者都不是特别好的做法,但两者在这里都应该做同样的事情。如果你都不写,你将不得不写std::cout << ...
,而不是只写cout << ...
——这看起来很烦人,但如果你想最终成为一名认真的C++程序员,你应该习惯。另请参见"为什么";使用命名空间std";被认为是不好的做法?。 -
main()
与int main()
:
这不是Code::Blocks应该允许的,因为它不是正确的C++。main
应始终返回int
。
总的来说,在这个基本示例中,环境/编译器之间似乎已经出现了许多令人遗憾的差异。然而,到目前为止,你的课程和VS2017都没有错,所以我建议你继续使用它们。如果你的讲师写的东西在不同的环境中不起作用,那么首先写那种代码可能是个坏主意。在这个简单的例子中,他们确实犯了几个错误。
附言:我强烈建议启用警告,因为它们可能会以更微妙的方式告诉你什么时候做错了。编译器不需要来阻止你犯很多错误("开枪打自己的脚"类型),但如果你要求停止(注意警告),它会帮助你。
只要禁用预编译头并且教程使用符合标准的代码,就可以使用Visual Studio。
关于预编译头:
Visual Studio默认情况下在C++命令行程序中启用预编译的标头。这意味着,在您的项目中,默认情况下,它会强制您在源代码的第一行中使用预编译的头(此处为pch.h)。通过禁用它们,您几乎可以*使第一个代码段在VS中工作。要做到这一点,请选择您的项目,转到"项目->属性"菜单,然后转到"配置属性->C/C++->预编译头"部分,然后将"预编译标题"设置更改为"不使用预编译标头"选项(这适用于VS 2012,将其应用于其他版本的VS应该很容易)。
如果你想在未来避免这种情况,你可以在VS中设置项目时创建一个空项目。
另请参阅:http://msdn.microsoft.com/en-us/library/h9x39eaw%28v=vs.71%29.aspx,如何避免预编译头
*:由于main的声明不是正确的C++,只有C(请参阅https://en.cppreference.com/w/cpp/language/main_function,什么是main的正确声明?)
对于您的实际问题,VS将适合您的课程,尽管我仍然对讲师的原始版本的代码感到困惑。
然而,花点时间了解你所有的更改做了什么,以及它们为什么解决了你的问题,这真的很有用。也许你已经这么做了——这不是我从这个短语中得到的印象
在谷歌上搜索后,我发现它会起作用
- 当您收到编译错误或警告时,请阅读它,然后尝试来理解它
- 如果你不理解错误——这是正常的,当然是在你学习的时候——那么对代码进行黑客攻击直到它正常工作是完全可以的。至少有时它会更快,而且你所取得的进步本身就是一种回报
- 如果你无法通过互联网破解代码,你只需要更多地研究错误信息。打开所有编译器错误和警告,并尝试多个编译器都会有所帮助——即使它们都失败了,消息也可能更有用。(我经常发现clang有有用的错误,godbolt.org非常有用)
-
如果破解代码确实得到了解决方案,您仍然应该尝试并理解为什么。现在你可以看到你更改了什么,查看最初的错误,并试图理解为什么你的更改会修复它。如果你做了多个更改,它们真的有必要吗?你明白他们都做了什么吗?为什么?
如果你这样做,你可以更快地解决下一个相关问题,而不是再次经历整个试错过程。您甚至可以编写更好的代码,从一开始就避免这个问题。
这是真正构成学习的部分,这就是为什么我要重点解决它
重要的修复是更改行
include <iostream>
main()
至
#include <iostream>
int main()
因为前者不是合法的C++。如果你的讲师真的写得很准确,而且你没有以某种方式抄袭,那么我不知道他们的例子为什么有效。
VisualStudio特有的东西是预编译的头,正如Gabriel的回答中所描述的那样。
但剩下的变化基本上是表面上的。更换:
using namespace std;
带有
using std::cout;
不会影响代码中的任何内容,只需使用
std::cout << "Hello world! :-)";
(根本没有using
)也同样有效。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 我正在上一门课程,但讲师说的东西不起作用