我正在上一门课程,但讲师说的没做

时间:2019-01-10 15:19:32

标签: visual-studio c++

我最近开始编程,并决定学习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有什么区别?在那种情况下有什么不同?我什至可以使用这门课程来学习吗?

谢谢!

编辑:在讲师的代码中缺少#的地方

3 个答案:

答案 0 :(得分:4)

  • #include <pch.h>
    参见加百列的答案。

  • include <iostream>#include <iostream>
    前者是完全错误的。它必须是#include#

  • using namespace std;using std::cout;
    尽管这两种方法都不是特别好的做法,但两者都应在此处做同样的事情。如果您都不编写它们,则必须编写std::cout << ...而不是仅编写cout << ...-这似乎很烦人,但是如果您最终想成为一名认真的C ++程序员,则应该习惯这一点。另请参见Why is "using namespace std" considered bad practice?

  • main()int main()
    这不是Code :: Blocks应该允许的,因为它不是正确的C ++。 main应该始终返回int

总体而言,您似乎已经在此基本示例上遇到了许多环境/编译器之间的差异。但是,到目前为止,您的课程和VS2017都没有错,因此我建议您继续使用它们。如果您的讲师编写的内容在其他环境中无法使用,那么首先编写此类代码可能是个坏主意。在这个简单的示例中,他们确实犯了几个错误。

PS:我强烈建议启用警告,因为警告可能会以更微妙的方式告诉您何时做错了事。并非不需要会导致很多错误(例如“自发自足”)阻止编译器运行,但是如果您要求停止(通过警告注意),它将有所帮助你。

答案 1 :(得分:3)

只要禁用预编译头并且教程使用符合标准的代码,就可以使用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.aspxHow to avoid precompiled headers

*:由于main的声明不是正确的C ++,而是C(请参阅https://en.cppreference.com/w/cpp/language/main_functionWhat is the proper declaration of main?),因此第一个代码段实际上不起作用

答案 2 :(得分:3)

对于您的实际问题,尽管您仍然对讲师的原始代码版本感到困惑,但是VS对于您的课程来说还是不错的。

但是,花点时间了解您所做的所有更改以及为什么它们可以解决您的问题,这确实非常有用。也许您已经这样做了-那不是我从

短语中获得的印象
  

经过一番谷歌搜索,我发现可以解决问题

  • 收到编译错误或警告时,请阅读并尝试 理解。
  • 如果您不理解该错误-并且这是正常现象,肯定是在您学习的时候-那么请对该代码进行修改,直到可以正常工作为止。至少有时速度更快,而您所取得的进步是他们自己的收获。
  • 如果无法利用互联网随意破解代码没有解决方案,则只需研究更多错误消息即可。打开所有编译器错误和警告,并尝试使用多个编译器都可以帮助您-即使它们全部失败,消息也可能更有用。 (我经常发现clang有有用的错误,而godbolt.org很有帮助)。
  • 如果破解代码确实得到解决方案,您仍然应该尝试并理解原因。现在,您可以看到更改的内容,查看原始错误并尝试了解更改的原因。如果您进行了多项更改,那么它们是否真的必要?您了解他们都做了什么,为什么?

    如果您这样做,则可以更快地解决下一个相关问题,而无需再次经历整个反复试验过程。您甚至可以编写更好的代码来避免该问题。

    这是真正构成学习的部分,这就是为什么我要着重指出这一点。


重要的解决方法是更改​​线路

include <iostream>

main()

#include <iostream>

int main()

因为前者不是合法的C ++。如果您的讲师确实写了准确的话,并且您没有以某种方式误抄,那么我不知道他们的例子为什么起作用。

Visual Studio专用的东西是预编译的标头,如Gabriel的答案所述。

但是剩下的变化本质上是表面上的。替换:

using namespace std;

使用

using std::cout;

仅使用

就不会影响代码中的任何内容
  std::cout << "Hello world! :-)";

(完全没有using)也可以正常工作。