为C ++获得正确的编译器

时间:2010-02-21 05:02:15

标签: c++ visual-c++

我正在尝试学习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文件。

Screenshot

Screenshot

[被修改]

好的,现在当我尝试构建项目时,我收到以下错误

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”,它说我可能会错过它。

11 个答案:

答案 0 :(得分:19)

不确定你在问什么。您提供的前两个示例是应该(将)使用VC ++编译的有效C ++程序。第三个示例是必须使用/ CLR编译器开关编译的C ++ / CLI程序(这称为托管C ++)。

编辑:添加更具体的信息(来自下面的评论):

前两个示例是标准(本机)C ++(尽管第二个示例具有MS专有宏)。他们编译为本机代码。第三个是C ++ / CLI(C ++的“托管”扩展)。它编译为托管(.NET)代码。只有第三个代码段以任何方式与.NET框架交互。所有这三个都是完全可构建的,并且可以使用VS 2008中的相应项目运行(无需命令行)!

根据您的最新更新,您可能已经修改了一些项目属性并更改了一些路径。该应用程序正在构建,但是当您尝试通过VS运行它时(顺便说一下,您应该使用<Ctrl>+F5执行此操作),无法找到可执行文件(有几种方法可以通过更改或玩各种设置)。

请注意构建和运行之间的区别。构建是编译和链接源代码的过程。正在运行正在启动生成的可执行文件你似乎在这些之间感到困惑(根据你对“......过时”对话框的抱怨来判断)。如果在对项目进行更改后尝试运行而不重建(即使保存了更改),则获取“...过时”对话框是正常的。只需确保单击“是”。在运行之前,您需要构建项目。

我的建议是完全删除您的项目和解决方案。创建一个新的空项目,正如这个现在非常重量级的线程中的其他地方所建议的那样,并且不要修改任何项目设置。如果这不起作用,那就严重错了!

另一个编辑:刚刚完成,因为这个问题一直在变化:

正如其他人已经指出的那样,第一个代码段的最终问题是使用预编译头(PCH)。默认情况下,在新的VS C ++项目中打开PCH。它们的目的是在许多实现文件包含同一组头时加快编译速度 - 防止编译器必须解析每个编译单元的头文件。

您有三种选择:

  1. (推荐)禁用PCH - 项目属性 - &gt;配置属性 - &gt; C / C ++ - &gt;预编译标题:将创建/使用预编译标题设置为不使用预编译标题。 (您不需要对“stdafx.h”文件或#include执行任何操作。)
  2. 将常用的#include放在“stdafx.h”中。在您的情况下,您可以将#include <iostream>放在“stdafx.h”中。
  3. 将您的#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将编译第一个示例就好了。 但是,您需要确保正确的项目设置:

  1. 创建“空项目”
  2. 通过“项目”菜单向项目添加“新项目...”。选择C ++(。cpp)文件。
  3. 将代码复制/粘贴到新文件
  4. F5 编译并运行。
  5. 当出现“项目已过期”对话框时,按“是”(构建项目)
  6. 上述步骤确保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的建议。但要澄清他的建议:

  1. 文件&GT;新建 - &GT;项目
  2. 选择项目类型“Win32”,然后选择模板“Win32控制台项目”
  3. 为项目指定名称和位置
  4. 选择“应用程序设置”
  5. 选中“清空项目”
  6. 在“解决方案资源管理器”中,右键单击“Sources”文件夹,然后单击Add-&gt; New Item
  7. 使用.cpp扩展名在“名称”框中键入文件的名称(如果愿意,可以忽略模板)。
  8. 在新文件中输入您的代码。

答案 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上搜索错误消息。