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

Supporting C++98 and C++11 simultaneously

我开始重写大量必须用于多个 OS/compiler 组合的代码。有些支持 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 或某些操作系统上的任何类似内容。 OS/compiler 升级也不是一个选项。我要么必须自己做,要么根本不做。

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

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

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

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

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

P.S。您可能会惊讶于对其中一些功能的普遍支持。例如,Visual Studio 2008 支持 override 就好了,尽管 __cplusplus < 201103L.

你能做到吗?

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

那么您的函数声明将如下所示:

virtual void myFunction() override;

这正是您想要的,不是吗?