草庐IT

c++ - 用 g++/bison/boost::variant 编写的解析器编译速度很慢

我用bison编写了一个verilog解析器,并使用boost::variant来存储每个规则的每个变体的所有不同情况。我用一个小例子,BNF表达式规则,来展示我的数据结构:expression:primary|expression+expressionprimary:(expression)|number存储它的数据结构是:typedefboost::variant,std::shared_ptr,>expressiontypedefboost::variant,std::shared_ptr,>primary类exp1/2和prim1/2用于存储expression和primary

c++ - g++ 4.9.4 缺少 LLONG_MAX?

我试图调试这个简单的代码:#include"limits.h"intmain(){longlonga=LLONG_MAX;return0;}如果我像这样运行它g++test.cpp我明白了test.cpp:Infunction‘main’:test.cpp:5:17:error:‘LLONG_MAX’undeclared(firstuseinthisfunction)longlonga=LLONG_MAX;我检查了这个常量的引用,它说:LLONG_MIN,LLONG_MAXandULLONG_MAXaredefinedforlibrariescomplyingwiththeCstand

c++ - 奇怪的 C++ namespace 解析怪癖和 g++ 与 clang++

这个问题在这里已经有了答案:Injectedclassnamecompilerdiscrepancy(3个答案)关闭4年前。这始于观察。我更改了一些看起来有点像这样的代码(编辑:我在这里取出了指定的初始化器,它们也不在原始代码中):structS{enumE{E1,E2}member;}//file1.ccSv1={S::E1};//file2.ccSv2={S::S::E2};请注意file2.cc过度限定了E2。然而,这在g++和clang++中都有效。(编辑2:这个特定VM上的g++是g++-5.4.1,但原始代码已经通过早期和后来的g++版本,加上多个clang版本。)事实上,

c++ - g++ 在多个文件上比使用 Google mock 的单一文件慢得多

我遇到了一个似乎与g++相关的问题。基本上,当一个程序被拆分成多个文件而不是一个单一的整体文件时,g++需要花费更多的时间来编译它。事实上,如果将单个文件组合在一起并进行编译,它运行起来比在g++命令行上列出单个文件要快得多。比如9个文件,编译需要1分39秒;当我把它们放在一起时,编译只需要13秒。我试过使用strace但它只是卡在cc1plus中;当我使用-f选项时,我仍然无法找出导致问题的原因。我已经隔离了问题。这是重现它的方法。我写了一个非常简单的程序,像这样:voidfunc_01(inti){intj;volatileint*jp;jp=&j;for(;i;i--)++*jp

c++ - 将固定大小内存边界上的 native 代码与 GCC/G++/AS 对齐?

我有一个C函数,其中包含将实现字节码解释器的字节码的所有代码。我想知道是否有一种方法可以在固定大小的边界上对齐内存中的编译代码段,以便我可以直接计算从字节码的值跳转到的地址?有点像数组的工作方式,但我不是从计算的地址读取,而是跳转到它。我知道我必须将执行下一个跳转的代码放在每个“字节码代码”段的末尾,并且我必须使边界大小至少与最大段的大小一样大.如果这甚至可能,我将如何告诉编译器/汇编器(gcc/g++/as)以所述方式对齐? 最佳答案 我意识到这并不是您所要求的,但这是使用GCC实现字节码解释器的标准方法。GCC的“compute

c++ - 尝试构建共享库 g++/mac 时 undefined symbol _main

我正在尝试在Mac上构建libdecodeqr。我的C++构建和链接历史都在Windows上,所以这是一个令人兴奋的发现之旅。我终于到了要创建链接库的地步。我正在运行的命令是:g++-shared-olibdecodeqr.so.0.9.3bitstream.ocodedata.ocontainer.oecidecoder.oformatinfo.ogalois.oimagereader.olibdecodeqr.o-L/opt/local/lib-archi386-lcxcore-lcv结果是:Undefinedsymbols:"_main",referencedfrom:start

c++ - 与同一个库链接两次是 g++ 的问题吗?

我注意到,当我使用gcc创建我的应用程序并在链接阶段查看输出时,我看到以下库包含两次:/home/rb01/opt/trx-HEAD/gcc/4.2.4/lib/../lib64/libstdc++.so所以我只是想知道这是g++(gcc)的问题还是第二个被忽略了?谢谢! 最佳答案 如果库中的符号已经解析,链接器将忽略它们。对于共享库,就像在这种情况下一样,链接器实际上并不链接。对于静态(.a)库,命令行上的多个拷贝实际上很有用,即使不是很漂亮,例如,如果main访问libb,libb访问libc,libc访问libb中的某些内容,

c++ - 使用 boost spirit 语法构建错误(boost 1.43 和 g++ 4.4.1)第二部分

我在编译一个小的spirit/qi语法时遇到了问题。我正在使用boost1.43和g++4.4.1。输入语法头:构建错误似乎指向“指令”规则的定义,也许是“[sp::_val=sp::_1]”以某种方式破坏了它,但这或多或少基于精神文档教程是用xml节点解析器做的输入语法.h#include#include#include#include#include#include#include#include#include#include#include#include#includenamespacesp=boost::spirit;namespaceqi=boost::spirit::q

c++ - vector<T>.erase() 与 g++ 的问题

以下代码在msvc上构建时没有错误,但在g++上无法编译。if(*it==listener){it=listeners.erase(it);}错误在于删除,完整代码为:voidAguiListener::removeListener(AguiWidget*listener){for(std::vector::const_iteratorit=listeners.begin();it!=listeners.end();++it){if(*it==listener){it=listeners.erase(it);}}}听众是:std::vectorlisteners;但是g++吐出大量错误

c++ - Linux g++ 在 C++ 中嵌入 Prolog 逻辑引擎

我在一个C++程序中有一些逻辑,它不仅异常复杂,而且需要多个解决方案,而Prolog是理想的解决方案。它有点像防火墙配置脚本,检查操作的输入,但有时需要多个操作。我想要的是这样的:classPrologEngine{LoadLogic(constchar*filename)throwPrologException;//Loadafileofprologrules,predicatesfactsetcintextualformat.MustbecallablemultipletimestoloadANDCOMPILE(forspeed)prologrulefiles.std::vecto