我最近发现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的版本,对吧?
答案 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
。