我最近开始编程,并决定学习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有什么区别?在那种情况下有什么不同?我什至可以使用这门课程来学习吗?
谢谢!
编辑:在讲师的代码中缺少#的地方
答案 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.aspx,How to avoid precompiled headers
*:由于main的声明不是正确的C ++,而是C(请参阅https://en.cppreference.com/w/cpp/language/main_function,What is the proper declaration of main?),因此第一个代码段实际上不起作用
答案 2 :(得分:3)
对于您的实际问题,尽管您仍然对讲师的原始代码版本感到困惑,但是VS对于您的课程来说还是不错的。
但是,花点时间了解您所做的所有更改以及为什么它们可以解决您的问题,这确实非常有用。也许您已经这样做了-那不是我从
短语中获得的印象经过一番谷歌搜索,我发现可以解决问题
如果破解代码确实得到解决方案,您仍然应该尝试并理解原因。现在,您可以看到更改的内容,查看原始错误并尝试了解更改的原因。如果您进行了多项更改,那么它们是否真的必要?您了解他们都做了什么,为什么?
如果您这样做,则可以更快地解决下一个相关问题,而无需再次经历整个反复试验过程。您甚至可以编写更好的代码来避免该问题。
这是真正构成学习的部分,这就是为什么我要着重指出这一点。
重要的解决方法是更改线路
include <iostream>
main()
到
#include <iostream>
int main()
因为前者不是合法的C ++。如果您的讲师确实写了准确的话,并且您没有以某种方式误抄,那么我不知道他们的例子为什么起作用。
Visual Studio专用的东西是预编译的标头,如Gabriel的答案所述。
但是剩下的变化本质上是表面上的。替换:
using namespace std;
使用
using std::cout;
仅使用
就不会影响代码中的任何内容 std::cout << "Hello world! :-)";
(完全没有using
)也可以正常工作。