【问题标题】:Is C++ CLI a superset of C++?C++ CLI 是 C++ 的超集吗?
【发布时间】:2010-09-15 19:59:56
【问题描述】:

C++ CLI 编译器是否能够在不修改的情况下编译一些大型 C++ 类集?

C++ CLI 是 C++ 的超集吗?

【问题讨论】:

  • 一开始我被这个问题弄糊涂了,后来我发现这里的“CLI”代表通用语言界面(.net 的一部分)而不是命令行界面。命名空间冲突!
  • 对不起 - “通用语言基础设施” - en.wikipedia.org/wiki/Common_Language_Infrastructure
  • 是的,我首先想到的是命令行界面。我想,酷!一个 VMS 问题!
  • @Vagrant 只是想知道......什么是“VMS”问题?
  • @hrishikeshp19 也许是虚拟内存系统。 ☺

标签: c++ c++-cli clr


【解决方案1】:

根据Wikipedia:

C++/CLI 应该被视为一种自己的语言(例如,使用一组新的关键字),而不是面向 C++ 超集的托管 C++

【讨论】:

  • 尽管大多数新关键字都是上下文相关的,可以在其他代码中用作标识符。
  • 无条件关键字有gcnew、generic和nullptr三个。最后一个现在也是 C++ 关键字。因此,C++/CLI 未能成为 C++ 超集的数量确实非常少……
  • @KerrekSB 我知道关键是它在技术上不是一个超集(这不会改变),但你不能这样做让它编译吗? #define gcnew gcnew_identifier #define generic generic_identifier // paste incompatible C++ code (or include directives) here #undef gcnew #undef generic (是的,这很丑,但我不会担心,因为堆栈溢出决定删除换行符不是我的错。)
  • @flarn2006:与往常一样,如果您使用保留名称(例如关键字名称)定义宏,则所有赌注都将失败。如果您的 C++ 代码调用内部想要使用这些关键字的标准库工具怎么办?一个更简单、更健壮的解决方案是简单地扫描您的 C++ 代码以查找有问题的标识符并重命名它们。每当新语言版本添加关键字时,标准 C++ 已经存在相同的问题。就迁移问题而言,这是最容易解决的问题之一。
  • 只要你的接口不包含有问题的名称,你也可以将 C++ 代码编译为 C++,然后将其与 C++/CLI 代码链接?我认为 C++/CLI 本来就是为了扮演这样的桥梁角色。 (但我认为它现在几乎已经死了。)
【解决方案2】:

技术上没有,但取决于 C++ 代码的标准,你可能会很好。当你进入 Windows 的东西时,你可能会遇到问题。我在 C++/CLI 中编译了我们在工作中使用的整个游戏引擎,它工作得很好。一位同事对所有 Mozilla 都做了同样的事情,但没有这样的运气。

【讨论】:

    【解决方案3】:

    对于 C++/CLI 的学习曲线,我还是个新手——但我自己也有同样的问题,到目前为止我已经确定 C++/CLI 作为一种语言,是标准 C++。

    如果您不使用 CLI 扩展,您的 C++ 代码最终将成为本机非托管代码,并且应该基本相同,但编译为 CLR IL,而不是本机 x86。

    一旦您开始使用 CLI 扩展(并开始使用对象/句柄/托管类),您就开始与底层 CLR 平台进行更频繁的交互。到那时,它本质上就变成了一种新的“语言”,你必须将你的想法分为“非托管”端和“托管”端。

    【讨论】:

      【解决方案4】:

      Marcus Heege 的书“Expert C++/CLI.NET for Visual C++ Programmers”的第 3 页指出:

      C++/CLI 是一组对 C++ 语言从中受益 实施的服务 CLI 提供。

      在同一页面的下方:

      C++/CLI 是 C++ 语言的超集。

      他的优秀书籍可从here免费获得。

      【讨论】:

      • 看来这本书是错的。见stackoverflow.com/questions/4610671/…
      • 引用权威 Herb Sutter:“至于这组扩展是否相当于不同的超集语言、兼容的方言和/或绑定:我认为你可以找到合理的人来查看它那些方式。无论您喜欢哪个名词,它都是我所知道的与任何编程语言、标准或其他语言最兼容的扩展集 [...]" - 请参阅 A Design Rationale for C++/CLI,版本 1.1 — 二月2006 年 2 月 24 日。
      【解决方案5】:

      C++/CLI 不是 C++ 的超集。它是一个带有添加的子集。例如。 C++/CLI 不支持多重继承。

      安杰洛

      【讨论】:

      • 没有多重继承?你在哪里看到的?
      • 在文档中?所有 CLI 语言仅支持单一继承。然而,也许你可以用非托管代码做 MI,从来没有检查过。
      • 嗯,我在维基百科上读了一点。我没有发现 C++/CLI “替换”了托管 C++。不幸的是,维基百科的文章没有说明 C++/CLI 在什么情况下支持 MI。
      • C++/CLI 非常好地支持类类型的多重继承,就像 ISO C++ 一样。它不支持托管类型的多重继承,但 ISO C++ 也不支持。
      【解决方案6】:

      我能够将整个 Qt 库(非常庞大)编译为 C++/CLI,并进行次要修改(主要是在构建环境中,但也修复了 Qt 源代码中的一个错误)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-06
        • 2011-01-10
        • 1970-01-01
        • 2015-11-28
        相关资源
        最近更新 更多