我正在上一门课程,但讲师说的东西不起作用

I'm doing a course but the things the lecturer says works don't

本文关键字:师说 不起作用 一门      更新时间:2023-10-16

我最近开始学习编程,并决定学习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)也同样有效。