对于初学者,我主要在Ubuntu 14.04上使用GCC 4.8。一切都是标准的。
好的,所以我环顾四周,似乎GCC对正则表达式的支持有点错误。但是,我所遇到的问题是如此基本,以至于我很想知道我是不是在做一些不允许的事情,或者如果C ++库可能比正则表达式部分更加妥协。我有两个简单的正则表达式,可以在程序的不同部分使用,所以我在全局命名空间中定义它们如下。
regex DATAFILE_PATTERN("^(.+?)(|\\.(db|[ng]?dbm|dir|pag|newhash))$");
regex TEMP_FILES("^.*(tmp|ypxfr_map).*$");
代码编译得很好,没有一个警告。但是,当我运行它时,它在std::regex_error
(格式错误的正则表达式)失败之后才到达main()
。
这个例外是令人发指的,因为正如你所看到的那样,正则表达式并没有错。即便如此,我还是稍微简化了一下,试图找出它是否会出现畸形。结果是,取决于表达式 - 所有的有效! - ,我有时会得到std::regex_error
,有时只是一个分段错误,没有任何语言级异常。
然后我将正则表达式从命名空间范围移动到使用它们的函数内部,现在它们运行得很好。
有没有更好的解释只是“这是一个GCC错误”?我的意思是在初始化全局变量和/或由于正则表达式复杂的内部结构而可能已达到的静态数据期间的堆栈限制。如果是这样,可以通过一些可调参数来克服它吗?
我用clang ++ 3.4和相同的libstdc ++尝试了相同的代码,结果是相似的,所以它让我觉得编译器可能不是那个怪(除非clang使用类似于GCC中的可调参数)。我试图安装LLVM的libc ++,但到目前为止我可以使它工作(链接时有很多未定义的符号,我还无法理解为什么 - 任何线索也会受到赞赏)。
我想知道其他编译器,例如MSVS或正确配置的Clang,是否会有类似的问题。