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

时间:2016-02-09 23:12:05

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

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

我感兴趣的主要是overridenoexceptfinal。换句话说,语法上很小的功能并没有真正具有C ++ 98/03等效功能。我不是想在What's the C++98 equivalent of the auto iterator reference?中使用ifdef来尝试使用#if __cplusplus > 201103L #define OVERRIDE override #else #define OVERRIDE #endif 。那太笨拙了。

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

virtual void myFunction() OVERRIDE;

然后我的函数声明如下:

MY_OVERRIDE

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

有更好的方法吗?我是否使用这种方法让自己陷入一些未知的头痛?另外,我应该尝试为宏使用不同的名称,例如var newData = json.reduce(function (arr, currentValue){ var index = false; arr.forEach(function(item, i) { if (item.name === currentValue.name && (item.truthy && currentValue.truthy || item.truthy === undefined && currentValue.truthy === false)) { index = i; } }); if (index === false) { var newItem = { name: currentValue.name, values: [currentValue.value] }; if (currentValue.truthy) { newItem.truthy = true; } arr.push(newItem); return arr; } arr[index].values.push(currentValue.value); return arr; }, []); ,以避免命名冲突吗?

2 个答案:

答案 0 :(得分:3)

没关系,这是一种可接受的做事方式。我在许多代码库中看到了这一点,就像我们以前看到的那样:

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

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

但是,您可能希望使用更少的R拼写覆盖。如果您正在编写其他项目将使用的库,则首选MY_OVERRIDE,否则OVERRIDE就可以了。

P.S。您可能会对这些功能的常见支持感到惊讶。例如,Visual Studio 2008支持override就好了,即使__cplusplus < 201103L

答案 1 :(得分:2)

你可以这样做吗?

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

然后你的函数声明如下:

virtual void myFunction() override;

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