有没有一种方法可以将C++11代码重构为C++代码,这些代码可以由能力较弱的编译器编译

Is there a way to refactor C++11 code into C++ code that can be compiled by a less capable compiler?

本文关键字:代码 能力 编译器 编译 C++ 重构 一种 方法 有没有 C++11      更新时间:2023-10-16

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

游戏机就是这样一种平台的例子,在这种平台上,你可能会被限制在一个可能不支持C++11功能的编译器上。另一个例子可能是英特尔的C++编译器。我很高兴看到英特尔一直在努力解决这一问题,在最新版本中,这似乎不是问题,但假设由于的某些原因,需要使用旧版本的编译器!

另一个半具体的例子是,我最近的一个项目是为开发中的一线使用构建一个diff工具;我对传统的基于行的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++11功能的使用,并将其重构为一些做同样事情但实际上会成功编译的代码,而不是将其用于通用的自动重构(例如,隔离和重构将字符串转换为C字符串并返回为字符串的代码)。

这是可能的吗?我不太熟悉C++11的功能,也不太熟悉降级到实现相同功能的"旧"C++的后果。当然,如果这类事情是可能的,我就做不到,因为我对语言没有足够的掌握(我也不认为我会有),不知道如何实现这一点。

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

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

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