如何使用gcc 4.8和没有C ++ 11标志的c ++中使用正则表达式?

时间:2016-01-23 18:28:18

标签: c++ regex c++11 gcc gcc4.9

我最近发现gcc 4.8中的正则表达式支持是不完整的,它确实是在gcc 4.9中实现的(参见Is gcc 4.8 or earlier buggy about regular expressions?)。

所以,想要在我的c ++程序中使用正则表达式,我按照这些说明(https://askubuntu.com/questions/466651/how-do-i-use-the-latest-gcc-4-9-on-ubuntu-14-04)将gcc更新为4.9。

现在当我尝试编译我的程序时,它说为了#include <regex>我必须指定编译器标志-std=c++11,我做了,现在我面对新的编译我没有遇到过的问题。之前(‘constexpr’ needed for in-class initialization of static data member)。

鉴于此,我认为现在最好坚持使用gcc 4.8并且不要在编译中指定gnu ++ 11标志。回到原点1.

那么,如果我不想切换到gcc 4.9并且用c ++ 11标记编译器,我可以使用c ++中的正则表达式吗?还有另一种方式吗?

谢谢!

PS:实际上它是导致编译问题的c ++ 11标志,而不是gcc的版本,对吧?

2 个答案:

答案 0 :(得分:2)

您可以安装PCRE库并使用它而不是C ++ 11标准正则表达式。 PCRE实际上是作为C库/接口设计的,而不是C ++,但是编写几个简单的包装类或者只是将它用作C库非常容易。

答案 1 :(得分:1)

该错误很可能意味着您依靠non-standard GCC extension来初始化非整数类型,如下所示:

struct X {
  static const double d = 3.14;
};

这在C ++ 98中无效,但受GCC支持。

C ++ 11标准增加了对初始化非整数类型的支持,但是您需要使用constexpr例如

struct X {
  static constexpr double d = 3.14;
};

使用-std=c++11-std=gnu++11进行编译时,不再支持旧的GCC特定扩展名。并且您必须使用标准的C ++ 11方式,即使用constexpr

因此,您可以通过将错误更改为constexpr或使其与GCC的C ++ 98扩展以及C ++ 11兼容来轻松解决该错误:

struct X {
#if __cplusplus > 199711L
  static constexpr double d = 3.14;
#else
  // this is non-standard but allowed by GCC in C++98 mode
  static const double d = 3.14;
#endif
};

这将允许您使用-std=c++11进行编译,因此您可以使用GCC 4.9的std::regex