草庐IT

gcc_test

全部标签

c++ - GCC pragma 在源文件中添加/删除编译器选项

我开发了一个跨平台的库,它充分利用了type-punning在套接字通信中。这个库已经在许多项目中使用,其中一些我可能不知道。不正确地使用这个库会导致危险的未定义行为。我想尽我所能确保正确使用此库。当然,除了文档,在G++下,我知道最好的方法是使用-fstrict_aliasing和-Wstrict-aliasing选项。在GCC下有没有办法在源文件级别应用这些选项?换句话说,我想写如下内容:MyFancyLib.h#ifndefMY_FANCY_LIB_H#defineMY_FANCY_LIB_H#pragma(somethingthatpushesthecurrentcompile

c++ - Boost.Test 测试静态库

我正在使用Boost.Test进行单元测试。因为一些原因,我想在不同的静态库上编写单元测试用例。问题是当我这样做时,自动注册器不工作。例如,如果我有类似的东西://foo_tests.cpp#defineBOOST_TEST_MODULE"Foo"#includeBOOST_AUTO_TEST_CASE(Bar){BOOST_CHECK(false);}//usedtogeneratelibFooTests.a//main.cpp#defineBOOST_TEST_DYN_LINK#defineBOOST_TEST_MAIN#include//usedtogeneratemain.o然

c++ - 可移植存档未在 GCC 下编译

我需要在Windows和Linux上对数据进行(反)序列化(并在两者之间传输文件)。我想使用可以在示例中找到的Boost序列化库的可移植二进制存档,参见例如在http://boost-doc-zh.googlecode.com/svn-history/r380/trunk/libs/serialization/example/这在Windows(VS2008)上运行良好,但无法在GCC4.3.2下编译并出现以下错误。有人可以提出解决方案吗?非常感谢!/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp:In

c++ - gcc 4.9.2 和 gcc 5.3 之间正则表达式支持的差异

谁能更熟悉gcc指出为什么下面的示例在gcc4.9.2上无法匹配但在gcc5.3上成功?有什么我可以做的来改变模式,以便它可以工作(在VS2013上似乎也能正常工作)?#include#includestd::regexpattern("HTTP/(\\d\\.\\d)\\s(\\d{3})\\s(.*)\\r\\n(([!#\\$%&\\*\\+\\-\\./a-zA-Z\\^_`\\|-]+\\:[^\\r]+\\r\\n)*)\\r\\n");constchar*test="HTTP/1.1200OK\r\nHost:192.168.1.72:8080\r\nContent-Le

c++ - clang 与 gcc : variadic lambda captures

我正在尝试在内部lambda中捕获可变参数lambda参数并在那里使用它。例如,请考虑以下代码:intmain(){autofirst=[&](auto&&...one){autosecond=[&](auto&&...two){return((one*two)+...);};returnsecond(one...);};returnfirst(5);}这适用于gcc9但无法使用clang8(https://godbolt.org/z/i2K9cK)。使代码编译的一种方法是显式捕获[&one...],但我想知道这是否是clang中的错误。同样有趣的是:将返回语句更改为直接扩展one的内

c++ - 为什么没有针对未使用的临时文件的 gcc/g++ 警告?

考虑以下代码:voidListenerImpl::attach(boost::shared_ptrsubscriber){boost::unique_lock(mtx);subscribers.push_back(subscriber);}voidListenerImpl::notify(MsgPtrmsg){boost::unique_lock(mtx);//notifyallsubscribersBOOST_FOREACH(boost::shared_ptrsubscriber,subscribers){subscriber->update(msg);}}(这是GoF中描述的观察者

c++ - 防止 gcc 在包含搜索路径上搜索当前目录 "-I-"选项

我们的开发环境大量使用带有本地修改header的目录,编译器应该看到这些header,而不是“提交的”“存储库”版本。如果headerA包含headerB,gcc会在A所在的同一目录中查找B,但不遵循搜索路径。所以我们在gcc上使用了-I-选项来防止这种情况发生。Gcc将严格遵循include-path的层次结构。与gcc4一样,-I-选项已被弃用并由-iqoute取代。我无法弄清楚如何使用-iquote选项获得相同的行为,因为我认为它没有在“当前”目录中禁用搜索的副作用。参见http://gcc.gnu.org/onlinedocs/cpp/Invocation.html#Invoc

c++ - 为什么 gcc 使用我的自定义迭代器优化掉这个 C++11 foreach 循环?

我正在尝试编写一些代码来创建序列的函数式样式。我写了一个函数,range(a,b),它返回一个你可以迭代的对象,foreach风格,遍历数字a,a+1,...,b-1.然后我写了另一个函数map(f,t),它返回另一个可迭代对象,其中序列中的每个元素都是用相应元素调用f的结果可迭代对象t.如果我使用-O1或更低版本进行编译,这将按预期工作;使用-O2或更高版本时,我的foreach循环(在底部的main中)得到完全优化并且没有打印任何内容。为什么会这样,我做错了什么?这是我的代码:templatestruct_range{Ta;Tb;_range(Ta,Tb):a(a),b(b){}s

c++ - 为什么gcc/clang要用两个128bit的xmm寄存器来传递一个值?

所以我偶然发现了一些我想了解的东西,因为它让我头疼。我有以下代码:#include#includetypedefunion{struct{floatx,y,z,w;}v;__m128m;}vec;vec__attribute__((noinline))square(veca){vecx={.m=_mm_mul_ps(a.m,a.m)};returnx;}intmain(intargc,char*argv[]){floatf=4.9;veca=(vec){f,f,f,f};vecres=square(a);//?printf("%f%f%f%f\n",res.v.x,res.v.y,re

c++ - GCC 上的#pragma pack(push, n)/#pragma pack(pop) 和 __attribute__((__packed__, aligned(n) )) 之间有什么区别?

具体在GCC上(即用GCC编译两者),以下两者的工作方式有何不同?structfoo1{chara;intb;}__attribute__((__packed__,aligned(n)));和:#pragmapack(push,n)structfoo2{chara;intb;};#pragmapack(pop)他们appeartobehavedifferently:foo1f1;foo2f2;int&i1=f1.b;//okint&i2=f2.b;//cannotbindpackedfield'f2.foo2::b'to'int&'为什么一个有错误而另一个没有?至少内存布局是否相同?