草庐IT

clang_complete

全部标签

c++ - 使用 clang 的 constexpr 深度限制(constexpr-depth 似乎不起作用)

有没有办法配置constexpr实例化深度?我正在运行-fconstexpr-depth=4096(使用clang/XCode)。但仍然无法编译此代码并报错:Constexpr变量fib_1必须由常量表达式初始化。无论是否设置选项-fconstexpr-depth=4096,代码都会失败。这是clang的错误还是预期的行为方式。注意:这在fib_cxpr(26)之前一直有效,27是它开始失败的时候。代码:constexprintfib_cxpr(intidx){returnidx==0?0:idx==1?1:fib_cxpr(idx-1)+fib_cxpr(idx-2);}intmai

c++ - 如何检测 Clang 中的 libstdc++ 版本?

我想用Clang编写一个“可移植”的C++库。“可移植”意味着我检测(在C预处理器中)编译环境中有哪些C++功能可用,并使用这些功能或提供我的解决方法。这类似于Boost库正在做的事情。但是,某些功能的存在不取决于语言,而是取决于标准库的实现。我特别感兴趣的是:类型特征(哪些是可用的,拼写是什么)如果initializer_list是constexpr。我发现这有问题,因为默认情况下Clang不使用其自己的标准库实现:它使用libstdc++。虽然Clang预定义了预处理器宏__GNUC__、__GNUC_MINOR__、__GNUC_PATCHLEVEL__,但它们分别被硬编码为值4

c++ - 为什么 std::seed_seq 根据 C++11 是不可复制的,为什么 gcc/clang 不符合?

考虑以下最小示例://main.cpp#includeintmain(int,char**){std::seed_seqseed1{1337,42};std::seed_seqseed2(seed1);std::seed_seqseed3=seed2;return0;}根据C++标准,这不应该编译,因为std::seed_seq既不是copyconstructible,也不copyassignable.然而,这对g++4.9都编译得很好,和clang3.4g++-4.9-std=c++11-Wallmain.cppclang++-std=c++11-Wallmain.cppandroi

c++ - 如何在 Mac 上找到实际的 Clang 版本?

注意:GetAppleclangversionandcorrespondingupstreamLLVMversion中没有提供任何答案似乎不再有效了。下载页面在http://releases.llvm.org/download.html和维基百科文章https://en.wikipedia.org/wiki/Clang似乎表明最新的Clang版本是6.0.0。但是在我的macOSHighSierra版本10.13.3上,我看到了这个输出:$clang--versionAppleLLVMversion9.1.0(clang-902.0.39.1)Target:x86_64-apple-d

c++ - Variadic 模板代码可在 GCC 4.6 上编译,但不能在 clang 或 GCC 4.7 上编译

我有这段代码(从更复杂的版本简化而来):templateclassTest{public:templatevoidprint(void(*function)(A2...,A1...)){}};voidtest_print(inta,floatb,doublec){}intmain(){Testtest;test.print(&test_print);}如果我在GCC4.6.3上使用g++-std=c++0xfilename.cpp编译它,它编译正常但是在clang3.0上使用clang++-std=c++0xfilename.cpp它抛出以下错误:filename.cpp:14:10:

c++ - Clang 中带有静态 constexpr 的奇怪的循环模板模式 (CRTP)

考虑我下面的简单示例:#includetemplateclassBase{public:staticconstexprinty=T::x;};classDerived:publicBase{public:staticconstexprintx=5;};intmain(){std::cout在g++中,这可以正常编译并按预期打印5。然而,在Clang中,它无法编译并出现错误nomembernamed'x'in'Derived'。据我所知这是正确的代码。我正在做的事情有问题吗?如果没有,是否有办法在Clang中完成这项工作? 最佳答案

c++ - 使用 clang 的 ThreadSanitizer 和 TBB 避免误报

有没有人试过clang'sThreadSanitizer与IntelThreadingBuildingBlocks(TBB)?到目前为止,我的经验是您会收到很多警告,即使对于相对简单的示例也是如此。不幸的是,其中许多似乎是误报。在thisanswer对于另一个ThreadSanitizer问题,建议使用抑制文件。这有帮助吗?是否有针对TBB或任何其他技术的抑制文件?(旁注:使用Helgrind,它看起来很相似。许多误报。) 最佳答案 当我在TSAN_OPTIONS中引用抑制文件时,我才让它工作。至少对我而言,仅在编译期间使用-fsa

c++ - 带有 O2 的 clang++ 的 undefined reference

我在一个项目上尝试CLang3.4和libc++,但在Release模式下出现奇怪的链接错误:/home/wichtounet/dev/eddic/src/ast/Operator.cpp:17:error:undefinedreferenceto'std::__1::basic_ostream>&std::__1::operator,std::__1::allocator>(std::__1::basic_ostream>&,std::__1::basic_string,std::__1::allocator>const&)'clang:error:linkercommandfail

c++ - 为什么 g++ 和 clang++ 之间的编译时间差异很大?

我遇到了一个talkslide在第12页有一个示例说明了在存在继承的情况下进行类型检查的困难。structa{typedefintfoo;};structa1:a{};structa2:a{};#defineX(b,a)\structa##1:b##1,b##2{};\structa##2:b##1,b##2{};X(a,b)X(b,c)X(c,d)X(d,e)X(e,f)X(f,g)X(g,h)X(h,i)X(i,j)X(j,k)X(k,l)X(l,m)X(m,n)n1::foomain(){}预处理后转化为:structa{typedefintfoo;};structa1:a{};

c++ - 使用 clang-format - 将空括号保持在同一行

我正在尝试配置clang-format,这样大括号通常会在它们自己的行上开始:voidfunc(){if(...){printf("TaDa\n");}}但我希望它在大括号为空时保持在一行中。(主要用于ctors):Bar::Bar(intval):_val(val){}目前它看起来像这样:Bar::Bar(intval):_val(val){}有什么想法吗?(经过编辑以使情况更清楚) 最佳答案 更新:万岁!现在可以使用Clang5.0或更高版本的自定义BreakBeforeBraces。请参阅documentation中的Spli