【问题标题】:getting the right compiler for C++为 C++ 获得正确的编译器
【发布时间】:2011-01-19 06:37:41
【问题描述】:

我正在尝试学习 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;
}

老实说,我在这些方面都没有区别,我不确定我是否应该下载一个较旧的编译器以便它工作。如果有人能告诉我这些有什么区别以及从那里去哪里。这将有很大帮助。谢谢 [已编辑]

我正在尝试做一个简单的hello world。但我收到错误“系统找不到指定的路径”。我有屏幕截图显示错误的样子。当我在构建文件之前清楚地保存文件时,这也意味着我的项目已经过时了。显然它找不到可执行文件。我去了调试文件夹,没有看到任何 .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" 的情况下尝试它时,它说我可能会错过它。

【问题讨论】:

  • 不禁想起呆伯特:“这里是个傻孩子……”:tomayko.com/writings/that-dilbert-cartoon。不完全公平,但太有趣了,不容错过。不了解windows,所以我不能提供任何严肃的建议。
  • stdafx.h 必须是 cpp 中的第一个标头。
  • 我将答案更新为灵丹妙药。随意更改您的接受的答案。 :)
  • 大声笑,你得了 18 分!我得把它给保罗。他第一个得到它

标签: c++ visual-c++


【解决方案1】:

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

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

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

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

请注意构建和运行之间的区别。构建是编译和链接源代码的过程。运行正在启动生成的可执行文件。您似乎对这些感到困惑(从您对“...过期”对话框的抱怨来看)。如果您在对项目进行更改后尝试运行而不重新构建,则出现“...过期”对话框是正常的(即使该更改已保存)。只需确保单击“是”即可。您需要先构建项目,然后才能运行它。

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

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

正如其他人已经指出的那样,第一个 sn-p 的最终问题是使用 预编译标头 (PCH)。 PCH 在新的 VS C++ 项目中默认打开。它们的目的是在许多实现文件包含相同的头文件集时加快编译速度——避免编译器必须为每个编译单元解析头文件。

您有三个选择:

  1. (推荐)禁用 PCH -- 项目属性 --> 配置属性 --> C/C++ --> 预编译头文件:将 创建/使用预编译头文件 设置为 不使用预编译头文件。 (您无需对“stdafx.h”文件或#include 执行任何操作。)
  2. 将您常用的#includes 放在“stdafx.h”中。在您的情况下,您可以将 #include &lt;iostream&gt; 放在“stdafx.h”中。
  3. 将您的#includes 放在 `#include "stdafx.h" 之后。 Microsoft 要求“stdafx.h”是编译单元中的第一个包含文件。

【讨论】:

  • 哇!一个实际上是正确的答案!在这个问题上这似乎很少见。
  • 除非发生了可怕的爆炸,或者选项设置不正确,否则它们会起作用。 +1
  • @BillyONeal:对于给定的“正确”值。最后我检查了一下,_tmain_TCHAR 不是 C++ 标准的一部分。第二个被 VC++ 接受是的,但是有效的 C++?
  • 是的,因为 _tmain 和 _TCHAR 只是分别扩展为 main 和 char 的宏。宏当然是标准的一部分,只要您不在文件中定义特定于 MS 的内容,预处理器就会将该文件转换为纯 C++。
  • 是的,我比你领先一步。我实际上已经创建了大约 7 个项目,并将它们保存在任何地方。还是得到它。我没有更改任何设置,因为我已经很久了。我在这个编译器中做的第一件事就是复制并粘贴代码
【解决方案2】:

一个小问题,我在答案的其他地方看不到:当使用预编译的头文件时,比如你的 stdafx.h,你需要先包含它们。将其更改为:

#include "stdafx.h"
#include <iostream>

这应该可以解决有关它的错误。

或者,简单地关闭预编译头文件可能更容易:项目 > 属性 > 配置属性 > C/C++ > 预编译头文件 > 将第一个选项切换为“不使用预编译头文件”。它们对大型项目很有用,但在你学习的时候会很尴尬和烦人,因为它们有额外的规则(比如“必须首先包含”),这不是标准 C++ 的要求。

【讨论】:

  • 在弄清楚之前我没有看到你的答案,但你最接近问题所在。
  • 这也是关闭预编译头文件的一个非常有用的技巧
  • 打败我。一天后,他终于发布了足够的信息来实际诊断出问题所在,而您则潜入胜利!恭喜。 :)
  • 速成者和死者......不过,我会给你一个安慰奖的投票 ;-)
【解决方案3】:

“差异”是迂腐的。后者只是Microsoft-specificentry points

在您学习 C++ 时,我建议您使用编译器,最好是让您专注于 C++ 而不是平台的操作系统。为此,我建议在 Linux 发行版上使用 g++,例如 Ubuntu

试试this tutorial,还有很多类似的,可以让你快速摆脱工具的束缚,专注于C++。

【讨论】:

  • 一个全新的操作系统有点像一把大锤来破解坚果。没有什么可以阻止在 VC++ 2008 Express 上编译 ISO C++ 代码。我认为他不需要另一个教程。
  • 最后一个是 C++/CLI,它本身是一门新语言,但与 C++ 很接近。
  • 是的,但是在他的位置上,我有两个主要问题:必须学习绝对最少的 C++(不应该提及 CLR/CLI,甚至应该提到 Windows),其次,只有 IDE混乱学习语言的心态。 C++ 的使用与 Visual Studio 相关联,并形成了依赖关系。没有VS,程序员就不能产生C++。这是在学习 MSVC++,而不是纯 C++。 C++ 开发人员必须了解从操作系统调用接口向上的所有内容才能有效。
  • VS 确实可以让您在一定程度上专注于问题。对于绝对的初学者,我不相信“单击此按钮,执行此咒语”涵盖它。根据 OP 的困惑,初学者需要了解编译和链接阶段,以及使用简单的入口点。在 OPs 当前技能水平取得相当大的进步后,VS 可以代替执行更多重复性的工作。
  • C++ 开发人员正在使用最后一种主流工业使用的系统编程语言(接受 C 和其他替代语言在高级应用程序开发中不是首选)。要与不同的操作系统接口进行安全有效的交互,需要仔细的关注和知识:这种多样性在有效的单平台 .NET 语言和 Java 中不存在。
【解决方案4】:
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)会拒绝它)。

【讨论】:

  • void main() 被一些编译器接受为非标准扩展。所以,你错过了一个地方!
  • @STingRaySC:它在任何地方都有效,但它是错误的。 homepages.tesco.net/J.deBoynePollard/FGA/…
  • 来自您的链接:因此,如果一个编译器的文档碰巧在任何地方说 main 可能具有返回类型 void 那么 main 可能确实具有返回类型 void 并且具有 void main() 的程序是一个符合标准的程序。 这到底有什么“错误”?这并不比 MS 将 wmain 定义为入口点更“错误”!
  • @STingRaySC: (1) 我没说wmain 是对的。 (2) 和gcc 抱怨error: ‘::main’ must return ‘int’
【解决方案5】:

Visual C++ Express 可以很好地编译第一个示例。 但是,您需要确保正确的项目设置:

  1. 创建一个“空项目”
  2. 通过“项目”菜单将“添加新项目...”添加到项目中。选择 C++ (.cpp) 文件。
  3. 将代码复制/粘贴到新文件中
  4. F5编译运行。
  5. 当“项目已过期”对话框出现时,按“是”(构建项目)

上述步骤确保 VC++ Express 不会将您的文件视为特殊的 Win32/Windows 控制台应用程序。

编辑:添加了额外的第 5 步以防止出现“找不到...”对话框。 通过确保 exe 文件不存在并对构建对话框回答“否”,我设法获得了相同的对话框。对于一个干净的空项目,exe 文件尚不存在。它必须首先建造。如果您回答“否”,请不要构建它,VC++ 会尽职尽责地不构建 exe,然后在稍后尝试运行时抱怨找不到它。

【讨论】:

  • 我会尝试一下,但事情就是这样。如果您查看我的问题中的第二张图片。它说它找不到 debug/www.exe 。当我查看文件夹时,我没有看到可执行文件。是否假设在编译时创建?如果有,为什么不在那里?
  • 我添加了一个我通常会跳过的额外步骤(我的设置会自动构建。)请注意,我已经获得了使用我的步骤编译的确切代码,并且我还复制了您的“找不到.. ." 对话框。
  • @numerical25:回答您的问题,是的,“www.exe”是可执行文件,应该在构建时创建。如果不是,则构建由于某种原因而失败。您能告诉我们当您尝试构建时“输出”窗口中显示的内容吗?
  • 我想通了。我刚刚发布了我的解决方案作为答案。我必须把它给彼得。即使我自己弄清楚了,他也最接近解决方案。感谢您的患者和您的帮助
  • 我希望我可以更改这篇文章的标题,以便人们了解真正的问题
【解决方案6】:

作为STingRaySC pointed out,你的三个例子都将在VC2008 express中编译;只是示例 2 和 3 是 VC2008 Express 在您创建项目时最初加载的内容(其中一个示例用于托管 C++,如 STingRaySC 所述)。

您可以删除第二个示例(C++ Win32 控制台应用程序项目)中的代码,然后粘贴第一个示例中更标准的 hello world 程序。它应该可以在 VC2008 Express 中正常编译和运行 - 它对我来说确实如此。

【讨论】:

    【解决方案7】:

    我。预编译头文件

    #include "stdafx.h"
    

    是一些棘手的事情。 如果你创建一个项目,VC 通常会打开预编译头文件。 这意味着创建了一个头文件 stdafx.h,它只编译一次。 这样做是为了加快大型环境中的编译时间。如果你启动 C++ 它会让你感到困惑。 如果您使用 stdafx.h,它 必须 成为 cpp 文件中的 first 标头。

    二。 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,......

    【讨论】:

      【解决方案8】:

      _tmain_TCHAR argv 是 C 运行时允许您处理 unicode 的方式。如果定义了_UNICODE,则_tmain 将扩展为wmain,并且_TCHAR 参数将是wchar_t 类型。如果未定义 _UNICODE,则 _tmain 将扩展为 main,这将是 ANSI 标准。

      因此,只要不定义_UNICODE,您发布的第二个sn-p 就符合标准。

      【讨论】:

      • 感谢您的回复,但这不是我要问的。我发布的是控制台应用程序的 3 个版本。我正在尝试区分 3.
      • 那么前两个都是有效的 C++,可以正常编译,最后一个是 C++/CLR 应用程序。
      • 如果是这样,STingRaySC 的答案就是您要寻找的答案。
      • 我明白了。他的回应是在这个最初的帖子之后。但是我如何编译 express 2008 中的第一个 sn-p。
      • 将其放入 .cpp 文件并将 IDE 指向它。仅仅因为“创建项目”向导为您填写了一些默认代码并不意味着您必须使用该代码;)
      【解决方案9】:

      已经为您筛选了很多打蜡的抒情诗和一些错误信息,但我建议您听从 wonsungi 的建议。但要澄清他的建议:

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

      【讨论】:

        【解决方案10】:

        哇!!我想到了!!!以下是我的原始代码

        #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 中,出于某种原因,在快速版中我不得不将它添加到标题中以使其工作。我不知道为什么,但这是一个解决方案,现在它可以工作了。

        【讨论】:

          【解决方案11】:

          在您的系统上下载并安装Dev-C++。如果代码在 Visual C++ 上不起作用,请在 Dev-C++(它使用 GCC 编译器)上试一试。您可能会得到相同的结果或不同的错误消息。每当您收到不理解的错误消息时,请在 Internet 上搜索错误消息。

          【讨论】:

          • -1:不回答问题。此外,只有第一个 sn-p 将建立在非 MS 实现之上。 OP 已经在尝试使用 VS——他不需要为了编译“hello world”而使用另一个开发环境。
          • 很公平,但这不是他/她的问题。 (S)他有一个非常好的 C++ 编译器。
          • 我经常在 sourceforge 上的 Dev-C++ 论坛上提供帮助,甚至我不再通过 VC++ Express 向任何人推荐 Dev-C++。我什至不再安装 Dev-C++,它的全部存在理由已经消失,它的调试器集成很糟糕。
          • 对于那些不想使用 VC++ 的人来说,CodeBlocks 可能是比 Dev-C++ 更好的选择。
          • 是的,告诉可怜的新手安装一个 5 年不支持的有缺陷的垃圾。为什么?你真的那么讨厌初级 C++ 开发人员吗?
          猜你喜欢
          • 2013-01-17
          • 2013-02-08
          • 1970-01-01
          • 1970-01-01
          • 2013-11-08
          • 1970-01-01
          • 2013-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多