草庐IT

clang_complete

全部标签

c++ - clang 和 gcc 为相同的代码生成不同的逻辑。哪个是对的?

我发现gcc-8和clang-6产生的逻辑有差异。这发生在一个真实的代码库中,当我使用clang开发时,我使用gcc部署。请告知哪个编译器有错误,以便我可以适本地提交错误。概要A可隐式转换为BA可从A构造(复制/移动)和std::initializer_list.初始化A时来自A&&:clang选择移动构造函数gcc选择initializer_list构造函数。现场演示:https://coliru.stacked-crooked.com/a/bc50bd8f040d6476MCVE#include#include#includestructthing;structthing_ref{

c++ - 在 Clang 中以可移植和最佳方式将 uint64_t 转换为字节数组

如果要转换uint64_t到uint8_t[8](小端)。在小端架构上,你可以做一个丑陋的reinterpret_cast或memcpy(),例如:voidfrom_memcpy(conststd::uint64_t&x,uint8_t*bytes){std::memcpy(bytes,&x,sizeof(x));}这会产生高效的组装:movrax,qwordptr[rdi]movqwordptr[rsi],raxret但是它不是可移植的。它在小端机器上会有不同的行为。用于转换uint8_t[8]至uint64_t有一个很好的解决方案-只需这样做:voidto(conststd::ui

c++ - 将 auto 关键字替换为推导类型(clang 或 VS2010)

是否有人编写了脚本、插件或可执行文件,将“auto”的每个实例替换为编译器推断的类型?我需要移植一些到处使用auto的C++11代码。Clang是我的第一个候选人。有没有人修改它来做这样的事情?另一种方法是从编译器解析错误,因为预期的类型可能在错误输出中。我可以-Dauto=int并可能返回"couldnotconvertstd::vector::iteratorto'int'" 最佳答案 不幸的是,这在一般情况下是不可能的。考虑:templatevoidfoo(T&t){autoit=t.find(42);...}...std::

c++ - 在 Mingw 64 位上使用 Clang

除了GCC之外,我还希望在Windows7上的MinGW-64bit环境中使用clang,两者都使用来自gcc的标准库。我正在使用http://sourceforge.net/projects/mingwbuilds/中的gcc_x64_4.8.1_win32_seh_rev1和Qt.我在这个环境中构建了clang3.3,没有任何标志(只是解决了HAVE_EHTABLE_SUPPORT编译问题)。我使用qmake构建过程,项目文件还有这些用于clang的行(仅Release模式):QMAKE_CC=clangQMAKE_CXX=clang++QMAKE_CXXFLAGS_RELEASE

c++ - 在折叠表达式中使用 lambda 时出现 "Uninitialized captured reference"错误 - clang 与 gcc

考虑以下代码:templateautofold_left(F&&f,X0&&x0,X1&&x1,Xs&&...xs){autoacc=f(x0,x1);return([&](autoy){returnacc=f(acc,y);}(xs),...);}conststd::stringa{"a"},b{"b"},c{"c"},d{"d"},e{"e"};constautocat=[](autox,autoy){return"("+x+","+y+")";};调用和打印fold_left(cat,a,b,c)时,g++7和clang++5都输出:((a,b),c)调用和打印fold_left

c++ - "pure virtual function called"在 gcc 4.4 上,但不在新版本或 clang 3.4 上

我有一个MCVE,它在使用g++4.4.7版编译时在我的一些机器上崩溃,但可以在clang++3.4.2版和g++6.3版中使用。我想知道它是来自未定义的行为还是来自这个古老版本的gcc的实际错误。代码#includeclassBaseType{public:BaseType():_present(false){}virtual~BaseType(){}virtualvoidclear(){}virtualvoidsetString(constchar*value,constchar*fieldName){_present=(*value!='\0');}protected:virtu

c++ - 在 Windows 上使用 -faddress-sanitizer 进行 Clang

我的意图是使用Clang作为Windows上Valgrind的替代品,以在我编写的C/C++程序中查找缓冲区溢出、动态内存滥用等.我已经按照提供的说明成功构建了Clanghere.我尝试使用-faddress-sanitizer选项(如here指定)编译一个简单的C程序,然后抛出以下错误-gcc.exe:error:unrecognizedcommandlineoption'-faddress-sanitizer'Usingbuilt-inspecs.COLLECT_GCC=C:/MinGW/bin/gcc.exeTarget:mingw32Configuredwith:../gcc-

c++ - 正如 Clang 似乎表明的那样,这段代码真的是未定义的吗?

我在使用单元测试库Catch的项目上打开了-fsanitize=undefined。来自Catch的一行被此标志指示为导致未定义的行为。我设法做了一个孤立的例子:#include#includeintmain(){std::ostringstreamos;os编译:clang++-fsanitize=undefinedmain.cpp如果我运行它,将给出以下打印:/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/bits/ios_base.h:96:24:runtimee

c++ - 我在 Clang 中发现错误了吗?

我尝试用Clang编译下面的代码classPrasoon{staticconstintdummy=0;};intconstPrasoon::dummy=0;intmain(){}上面的代码用Clang.编译没有报错prasoon@prasoon-desktop~$clang++--versionclangversion2.8(trunk107611)Target:i386-pc-linux-gnuThreadmodel:posixprasoon@prasoon-desktop~$catbug.cppclassPrasoon{private:staticconstintdummy=0;}

c++ - clang 上的模棱两可的运算符重载

当我尝试编译这个测试程序时:structcomma_guard{templateconstcomma_guard&operator,(T&&)const{return*this;}};structfoo{};templateToperator,(Tx,foo){returnx;}intmain(){(comma_guard(),foo());}我在clang上得到一个编译错误:comma_guard.cpp:20:19:error:useofoverloadedoperator','isambiguous(withoperandtypes'comma_guard'and'foo')(c