12

这通常会对 C++11 代码的代码可移植性产生影响。我说的是有一个类似于 C/C++ 预处理器阶段的新代码生成阶段,我们可以使生成的 C++ 代码对更大的编译器系列更加“友好”。我认为这可能会对将人们转移到使用 C++11 进行编码的可行性产生影响。

游戏机是一种平台类型的示例,您可能会被困在可能不支持不错的 C++11 功能的受限编译器上。另一个例子可能是英特尔的 C++ 编译器。我很高兴看到英特尔一直在努力解决这个问题,看起来这在最新版本上不是问题,但假设出于某种原因需要使用旧版本的编译器!

另一个半具体的例子,是我最近的一个项目是构建一个 diff 工具,供开发中的一线使用;我对传统的基于行的差异感到不满意,所以我构建了一个小命令行工具,它使用 C++ 中的diff_match_patch实现。C++11 已经“渗透”到胶水代码中,因为auto它太酷了,但结果是我基本上不得不在 Linux 上构建 LLVM、Clang 和 libc++ 才能开始在 Linux 上使用我的工具。甚至不清楚如何以源代码形式将 C++11 项目分发到 Linux,因为在 Linux 上设置 clang 有点考验人。这并不是说它不能完成,而是它太先进了,一个人必须花几个小时才能在那里设置工具链。(更新:好吧,几个月/几年后,同样的小工具现在可以使用 centos 7 软件包提供的 GCC 构建得非常好,所以这是一种解脱。)

因此,如果我有一种神奇的方法可以自动重构 C++11 工具以生成旧式编译器可以立即接受的老式 C++ 代码,这可能会使某些人的生活变得更轻松一些。

在使用 clang 自动重构代码方面取得了一些惊人的进展,这在David 的回答中得到了很好的体现,所以它让我想到,也许有可能基于这项技术建立一个特定的自包含工具可以有效地将 C++11 代码模式转换为相应的非 C++11 等价物。这里的想法是,与其将其用于通用自动重构(例如,隔离和重构将字符串转换为 C 字符串并返回字符串的代码),我们也许可以将其用于隔离不受支持的 C++ 的使用11 个特性,并将它们重构为一些做同样事情但实际上可以成功编译的代码。

这是可能的吗?我不太熟悉 C++11 的功能以及降级到实现相同功能的“旧”C++ 的后果。如果这种事情是可能的,我肯定做不到,因为我没有(我也不希望我永远有)足够的语言掌握来知道如何实现这一点。

我想一个更合适的问题是,这值得努力吗?很难看出(鉴于 LLVM 显然非常有能力交叉编译到 ARM)如何阻止使用 clang 来使用更直接的方法完成工作,例如交叉编译到目标平台。我的猜测是,这只是我的妄想症,将来我真的不需要担心让我的 C++11 代码在所有可能的目标平台上顺利运行,因为它们应该是 x86、x86-64 或反正ARM。但是谁知道几年后我的工作会是什么。

4

1 回答 1

2

此外,g++多年来一直支持越来越多的 C++11 部分。根据http://gcc.gnu.org/projects/cxx0x.html,4.8.1具有相当完整的支持,并且大多数最有趣的部分已经可用的时间更长(例如auto,可变参数模板在 4.4 中,自定义字符串文字在4.5 和 4.6 中的 constexprs)。

安装(或在必要时构建)新版本可能gcc比尝试重构代码更容易。

于 2013-07-13T01:10:55.700 回答