c++ - 有没有办法将 C++11 代码重构为可以由功能较弱的编译器编译的 C++ 代码?

标签 c++ c++11 compilation portability automated-refactoring

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

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

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

因此,如果我有一种神奇的方法来自动重构 C++11 工具以生成老式 C++ 代码,而老式编译器可以开箱即用,这可能会让一些人的生活变得更轻松也许吧。

在使用 clang 进行自动化代码重构方面取得了一些惊人的进展,这在 David's answer here 中得到了很好的介绍。 ,所以它让我想到也许有可能基于这项技术建立一个特定的独立工具,它可以有效地将 C++11 代码模式转换为相应的非 C+ +11 当量。这里的想法是,与其将其用于通用自动重构(例如,隔离和重构字符串转换为 C 字符串并返回字符串的代码),不如将其用于隔离不受支持的 C++ 的使用11 个功能并将它们重构为一些代码,这些代码执行相同的操作但实际上可以成功编译。

这是可能的吗?我不太熟悉 C++11 的功能,也不太熟悉降级到实现相同功能的“旧”C++ 的后果。看起来如果这种事情是可能的,我做不到,因为我没有(我也不希望我会)对语言有足够的了解来知道如何实现它。

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

最佳答案

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

安装(或构建,如有必要)更新版本的 gcc 可能比尝试重构您的代码更容易。

关于c++ - 有没有办法将 C++11 代码重构为可以由功能较弱的编译器编译的 C++ 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17478792/

相关文章:

multithreading - 初始化没有魔法静态的空多态单例类型

c++ - 在不同的类上调用不同的成员函数

python - 编译时检查以及主要脚本字节码存储在 Python 中的什么位置?

c++ - 在吃 EOF 后重用 std::cin

c++ - 使用调试断言时避免 ODR 违规

c++ - boost::mpl::bind 的使用

c - 我写下要扫描的第一个数字,按回车键后,它会在 Windows 中显示 'not responding' 消息

c++ - NEON 与英特尔 SSE - 某些操作的等效性

c++ - 对象的 Range Base 循环

android - Intellij Idea慢速编译Android应用