1

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

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

现在,当我尝试编译我的程序时,它说为了#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 的版本,对吧?

4

2 回答 2

2

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

于 2016-01-23T18:32:37.870 回答
1

该错误很可能意味着您依赖非标准 GCC 扩展来初始化非整数类型,如下所示:

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

于 2019-01-28T21:29:28.313 回答