我正在尝试学习c ++,但我阅读或查找的大部分教程和书籍都教给你这个......
(我假设像大多数教程一样,他们在开始时教授在win32控制台或CLR控制台中编码。在任何一种情况下,以下都不起作用。)
#include <iostream>
int main( )
{
std::cout << "Hello World\n";
return (0);
}
我拥有的IDE是Visual C ++ 2008 Express版,他们接受这样的代码
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
或者像这样
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
return 0;
}
老实说,我对这些都没有区别,我不确定是否应该只下载一个较旧的编译器以使其正常工作。如果有人能告诉我这些是什么区别,从那里去哪里。这将有很大帮助。谢谢 [编辑]
我正在尝试做一个简单的问候世界。但我得到错误“系统无法找到指定的路径”。我有截图显示错误的样子。它也说我的项目已经过时,因为我在构建它之前清楚地保存了文件。显然它找不到可执行文件。我去了调试折叠,没有看到任何.exe文件。
[被修改]
好的,现在当我尝试构建项目时,我收到以下错误
1>------ Rebuild All started: Project: test, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'test', configuration 'Debug|Win32'
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>test.cpp
1>c:\users\numerical25\desktop\test\test\test.cpp(1) : warning C4627: '#include <iostream>': skipped when looking for precompiled header use
1> Add directive to 'stdafx.h' or rebuild precompiled header
1>c:\users\numerical25\desktop\test\test\test.cpp(6) : error C2653: 'std' : is not a class or namespace name
1>c:\users\numerical25\desktop\test\test\test.cpp(6) : error C2065: 'cout' : undeclared identifier
1>Build log was saved at "file://c:\Users\numerical25\Desktop\test\test\Debug\BuildLog.htm"
1>test - 2 error(s), 1 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
这是我使用的代码
#include <iostream>
#include "stdafx.h"
int main( )
{
std::cout << "Hello World\n";
return (0);
}
注意:我尝试使用#include“stdafx.h”时没有使用#include“stdafx.h”,它说我可能会错过它。
答案 0 :(得分:19)
不确定你在问什么。您提供的前两个示例是应该(将)使用VC ++编译的有效C ++程序。第三个示例是必须使用/ CLR编译器开关编译的C ++ / CLI程序(这称为托管C ++)。
编辑:添加更具体的信息(来自下面的评论):
前两个示例是标准(本机)C ++(尽管第二个示例具有MS专有宏)。他们编译为本机代码。第三个是C ++ / CLI(C ++的“托管”扩展)。它编译为托管(.NET)代码。只有第三个代码段以任何方式与.NET框架交互。所有这三个都是完全可构建的,并且可以使用VS 2008中的相应项目运行(无需命令行)!
根据您的最新更新,您可能已经修改了一些项目属性并更改了一些路径。该应用程序正在构建,但是当您尝试通过VS运行它时(顺便说一下,您应该使用<Ctrl>+F5
执行此操作),无法找到可执行文件(有几种方法可以通过更改或玩各种设置)。
请注意构建和运行之间的区别。构建是编译和链接源代码的过程。正在运行正在启动生成的可执行文件你似乎在这些之间感到困惑(根据你对“......过时”对话框的抱怨来判断)。如果在对项目进行更改后尝试运行而不重建(即使保存了更改),则获取“...过时”对话框是正常的。只需确保单击“是”。在运行之前,您需要构建项目。
我的建议是完全删除您的项目和解决方案。创建一个新的空项目,正如这个现在非常重量级的线程中的其他地方所建议的那样,并且不要修改任何项目设置。如果这不起作用,那就严重错了!
另一个编辑:刚刚完成,因为这个问题一直在变化:
正如其他人已经指出的那样,第一个代码段的最终问题是使用预编译头(PCH)。默认情况下,在新的VS C ++项目中打开PCH。它们的目的是在许多实现文件包含同一组头时加快编译速度 - 防止编译器必须解析每个编译单元的头文件。
您有三种选择:
#include
执行任何操作。)#include
放在“stdafx.h”中。在您的情况下,您可以将#include <iostream>
放在“stdafx.h”中。#include
放在`#include“stdafx.h”之后。 Microsoft要求“stdafx.h”是编译单元中第一个包含的文件。答案 1 :(得分:7)
一个小问题,我在答案的其他地方没有看到:当使用预编译的头文件时,例如你的stdafx.h,你需要先包含它们。将其更改为:
#include "stdafx.h"
#include <iostream>
这应该可以解决有关它的错误。
或者,简单地关闭预编译的头文件可能更容易:Project&gt;属性&gt;配置属性&gt; C / C ++&gt;预编译标题&gt;将第一个选项切换为“不使用预编译头”。它们对于大型项目非常有用,但在学习时会很尴尬和讨厌,因为它们有额外的规则(比如“必须首先包含”),这些规则不是标准C ++的要求。
答案 2 :(得分:4)
“差异”是迂腐的。后者只是Microsoft-specific entry points。
在学习C ++时,我建议你使用编译器,最好是一个让你专注于C ++而不是平台的操作系统。为此,我建议g++在Linux发行版上,例如Ubuntu。
尝试this tutorial,还有许多类似的东西可以让你克服与工具的束缚,并专注于C ++。
答案 3 :(得分:2)
int main();
int main(int argc, char* argv[]);
这些是标准的C ++。
int _tmain(int argc, _TCHAR* argv[]);
int wmain(int argc, wchar_t* argv[]);
这些是 Windows特定的来处理Unicode参数。请参阅What is the difference between _tmain() and main() in C++?。
int main(array<System::String^>^ args);
这是不是 C ++。这是C ++ / CLI。
为了获得最佳便携性,请始终使用第一种形式。
此外,
int main(int argc, char** argv, char** envp);
这是一个常见的POSIX扩展。 Windows也支持这种形式的main。 envp
表示(指向)环境变量。
int main(int argc, char** argv, char** envp, char** apple);
这显然只适用于Mac。
void main();
这是错误的(非标准,一些编译器(例如gcc)会拒绝它)。
答案 4 :(得分:2)
Visual C ++ Express将编译第一个示例就好了。 但是,您需要确保正确的项目设置:
上述步骤确保VC ++ Express不会将您的文件视为特殊的Win32 / Windows控制台应用程序。
编辑:添加了额外的第5步,以防止“无法找到...”对话框。 我设法通过确保exe文件不存在来获得相同的对话框,并在构建对话框中回答“否”。使用干净的空项目,exe文件尚不存在。它必须先建立。如果你回答“否”不建立它,VC ++尽职尽责地不构建exe,后来抱怨在以后尝试运行它时无法找到它。
答案 5 :(得分:1)
作为STingRaySC pointed out,您的所有三个示例都将在VC2008 express中编译;只是示例2和3是VC2008 Express在创建项目时最初将加载的(其中一个示例是针对托管C ++,如STingRaySC所述)。
您可以删除第二个示例(C ++ Win32控制台应用程序项目)中的代码,然后从第一个示例中粘贴更标准的hello world程序。它应该在VC2008 Express中编译并运行得很好 - 它确实适用于我。
答案 6 :(得分:1)
<强>予。预编译标题
#include "stdafx.h"
是某种棘手的东西。 如果您创建项目,VC通常会打开预编译的头。 这意味着创建了一个头文件stdafx.h,它只编译一次。 这样做是为了加快大环境中的编译时间。如果你启动C ++ 它会让你困惑。 如果您使用stdafx.h, 将成为cpp文件中的第一个标头。
<强> II。 Unicode(Utf16)
int _tmain(int argc, _TCHAR* argv[])
Microsoft使用UTF16来实现unicode字符串。 这意味着您将获得两个版本的main。
int main(int argc, char* argv[])
int main(int argc, wchar_t* argv[])
如果你开始这也会让人感到困惑。
要简单地开始,您可以使用您想要的任何编辑器。 创建文件。 打开Visdual studio 2008命令提示符
cl main.cpp
main.exe
您将使用书籍中的代码查看Hello World。 然后尝试了解VC的一些设置。
但是你应该总是使用一个空项目。 否则你必须关心stdafx,UNICODE,......
答案 7 :(得分:0)
_tmain
argv的 _TCHAR
是C运行时允许您处理unicode的方式。如果定义了_UNICODE
,则_tmain
将扩展为wmain
,_TCHAR
参数将为wchar_t类型。如果未定义_UNICODE
,则_tmain
将扩展为main,这将是ANSI标准。
因此,只要未定义_UNICODE
,您发布的第二个代码段就符合标准。
答案 8 :(得分:0)
许多打蜡抒情和一些错误信息已经筛选出来,但我建议遵循wonsungi的建议。但要澄清他的建议:
答案 9 :(得分:0)
活泉!!我想到了!!!以下是我的原始代码
#include <iostream>
int main( )
{
std::cout << "Hello World\n";
return (0);
}
缺少头文件#include“stdafx.h”。所以我必须把它包含在那里所以我像这样添加它
#include <iostream>
#include "stdafx.h"
int main( )
{
std::cout << "Hello World\n";
return (0);
}
我仍然收到类似于我在底部编辑过的问题中看到的错误。所以我做的是我把#include添加到我的头文件中,然后就可以了!!!!!
即使是书籍和很多教程都显示将#include添加到实际的cpp中,由于某些原因,在快递版本中我必须将它添加到标题中才能使用它。我不知道为什么,但它是一个解决方案,现在它可以工作。
答案 10 :(得分:-1)
在您的系统上下载并安装Dev-C++。如果代码在Visual C ++上不起作用,请在Dev-C ++(使用GCC编译器)上试用。您可能会得到相同的结果或不同的错误消息。每当收到您不理解的错误消息时,请在Internet上搜索错误消息。