有没有一种方法可以将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++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
的新版本可能比重构代码更容易。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- C++输入验证,以避免破坏代码的能力
- 有没有一种方法可以将C++11代码重构为C++代码,这些代码可以由能力较弱的编译器编译