同时支持C++98和C++11
Supporting C++98 and C++11 simultaneously
我开始重写大量必须用于多个 OS/compiler 组合的代码。有些支持 C++11,有些只支持 C++98/C++03。我正在寻找一种能够在代码中使用 一些 C++11 功能的方法。
我主要感兴趣的是 override
、noexcept
和 final
。换句话说,实际上没有 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;
这正是您想要的,不是吗?
我开始重写大量必须用于多个 OS/compiler 组合的代码。有些支持 C++11,有些只支持 C++98/C++03。我正在寻找一种能够在代码中使用 一些 C++11 功能的方法。
我主要感兴趣的是 override
、noexcept
和 final
。换句话说,实际上没有 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;
这正是您想要的,不是吗?