c++ - 同时支持C++98和C++11

标签 c++ c++11 c++98

我开始重写大量必须适用于多种操作系统/编译器组合的代码。有些支持 C++11,有些只支持 C++98/C++03。我正在寻找一种能够在代码中使用一些 C++11 功能的方法。

我主要感兴趣的是overridenoexceptfinal。换句话说,实际上没有 C++98/03 等效项的语法小功能。我并没有像 What's the C++98 equivalent of the auto iterator reference? 中那样使用 ifdef 尝试在范围 for 循环中硬塞进.这太笨拙了。

我最初的想法是使用预处理器来做这样的事情:

#if __cplusplus > 201103L
#define OVERRIDE override
#else
#define OVERRIDE
#endif

然后我的函数声明看起来像:

virtual void myFunction() OVERRIDE;

我不知道像 Boost 这样的产品是否已经有一些机制,但这与我的情况无关,因为我无法访问 Boost 或某些操作系统上的任何类似内容。操作系统/编译器升级也不是一个选项。我要么必须自己做,要么根本不做。

有更好的方法吗?使用这种方法我是否正在为一些未知的头痛做准备?另外,我是否应该尝试为宏使用不同的名称,例如 MY_OVERRIDE,以避免命名冲突?

最佳答案

那很好,这是一种可以接受的做事方式。我在许多代码库中都看到了这一点,就像我们过去看到的那样:

#ifdef __STDC__
void func(int x)
#else
void func(x)
    int x;
#endif
{
    ...
}

我无法想象 Boost 会比您写的更实用或更简洁。

但是,您可能希望使用较少的 R 来拼写 override。 MY_OVERRIDE如果您正在编写其他项目将使用的库,则首选,否则 OVERRIDE很好。

附言您可能会惊讶于对其中一些功能的普遍支持。例如,Visual Studio 2008 支持 override很好,即使__cplusplus < 201103L .

关于c++ - 同时支持C++98和C++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35304040/

相关文章:

c++ - 将第一个元素移动到队列的后面

c++ - 宽松的内存顺序效果是否可以延长到执行线程的生命周期之后?

c++ - 如何获取模板模板参数的模板参数?

c++ - 在 C++03 中模拟 =delete 以限制复制/赋值操作的最简单方法是什么?

c++ - 使用 memset 初始化后写入二维数组时出现访问冲突写入错误

c++ - 从文本文件中读取特定条目

c++ - 函数返回值的作用域

C++ std::unique_ptr 从函数返回并测试 null

c++ - 在 std::vector<std::pair> 中查找

c++ - 如何将库的 .pc 文件添加到特定目录?