草庐IT

c++ - 如何在预处理时可靠地检测 clang 的版本?

显然,与Xcode捆绑在一起的clang不遵守上游__clang_major__和__clang_minor__值,而是报告某种面向用户的Xcode版本。这里是clang的各种MacPorts安装的值,以供引用。他们似乎尊重上游版本标识符。我在Linux上测试时得到了类似的值。➜prohibit-clang-3.2/opt/local/bin/clang++-mp-3.2-dM-E-xc/dev/null|grep__clang_m#define__clang_major__3#define__clang_minor__2➜prohibit-clang-3.2/opt/local/bi

c++ - 是什么导致 clang 找不到 unordered_map header ?

我正在尝试使用Clang++编译我在网上找到的程序。Makefile生成此命令:clang++-c-archx86_64-msse3-std=c++11-stdlib=libstdc++-Wno-missing-field-initializers-Wno-missing-prototypes-Wreturn-type-Wno-non-virtual-dtor-Wno-exit-time-destructors-Wformat-Wmissing-braces-Wparentheses-Wno-switch-Wunused-function-Wunused-label-Wno-unuse

c++ - 神秘的链接器错误 "undefined reference to ` __gxx_personality_v 0'"在 cygwin 中使用 clang

我做了一些搜索,所有答案似乎都建议使用clang++而不是clang(或者更确切地说是g++代替gcc),这就是我最初所做的。尽管如此,问题仍然存在,无论是clang++-Wall-std=c++11-otest.exetest.cppA.cppB.cppetc.cpp或clang++-lstdc++-Wall-std=c++11-otest.exetest.cppA.cppB.cppetc.cpp编译和链接在Cygwin中使用g++工作正常。g++-Wall-std=c++11-otest.exetest.cppA.cppB.cppetc.cpp更新:这是链接期间的信息。clang是

c++ - 为所有 iOS 架构编译 c++ 文件

我有一些cpp文件,我想编译它们以便在模拟器和iPhone上运行。我想做的是:g++-cfile1.cppfile2.cpp-std=c++11arrcslibabc.a*.o这可以很好地编译,但只适用于x86_64架构......显然......有什么简单的方法可以编辑这两行命令,以便为所有架构编译一个库(x86_64i386armv7armv7sarm64)?还是我应该构建一些大型脚本来拥有该库?如果是这样?有现成的脚本吗?我也尝试过使用-arch来运行它:g++-cfile1.cppfile2.cpp-std=c++11-archarmv7-archx86_64但这些是我遇到的一

c++ - 按值捕获异常 - gcc 和 clang 不同意

考虑这个简短的片段:structB{B()=default;explicitB(Bconst&){}};structD:B{};intmain(){try{throwD{};}catch(B){}}gcc接受这段代码,clang认为它格式错误:main.cpp:17:13:error:nomatchingconstructorforinitializationof'B'catch(B){^谁是对的? 最佳答案 我认为这是一个gcc错误(由于还没有人否决这个答案,我将其提交为70375)。两个编译器都正确地同意应该捕获D{},根据[e

c++ - 指针上的指针 - 性能损失的原因

我回答了thisquestion,并注意到我认为编译器的一种奇怪行为。我首先编写了这个程序(作为我在那里回答的一部分):classVector{private:double**ptr;public:Vector(double**_ptr):ptr(_ptr){}inlinedouble&operator[](constintiIndex)const{return*ptr[iIndex];}};extern"C"inttest(constdoublea);intmain(){doublea[2]={1.0,2.0};Vectorva((double**)&a);doublea1=va[0

c++ - Clang 无法在模板类特化中编译模板函数,该函数具有来自模板声明的*不同的返回类型*

以下函数derefItemX()在GCC4.8-5.3上编译正常,但在CLang3.8上编译失败://!AccessoryOperations-templateargumentdependedwrapperstemplate//ForNodes/non-scopedstoragestructOperations{//!\briefDefererencewrappedordirectiterator//!//!\paramielIItemXT&-iteratortobedereferenced//!\returnItemT&-resultingreferencetemplateconst

c++ - Clang 提示未评估的上下文中未定义的 constexpr 函数

我正在使用一个简单的SFINAE技巧来检查成员函数是否存在,如下所示:#includetemplatestructhas_size{templatestaticconstexprautocheck(T*)->decltype(std::declval().size(),std::true_type{});templatestaticconstexprautocheck(...)->std::false_type;staticconstexprboolvalue=decltype(check(nullptr))::value;};//Usage:static_assert(has_siz

c++ - 在使用 Clang 编译 CRTP Singleton 时,如何解决声称缺少 "explicit instantiation declaration"的问题?

我们正在使用curiouslyrecurringtemplatepattern实现单例。但是,在最近的Clang版本中,我们收到了-Wundefined-var-template警告。建议的修复方法是添加“显式实例化声明”。我试图这样做,但后来在定义单例模板类成员变量的编译单元中出现有关“实例化后的显式特化”的错误。解决此警告突出显示的问题的适当构造是什么?简化详细信息(已删除大部分逻辑,以制作MCVE):单例基础.hh:templateclassSingletonBase{public:staticT*get_instance(){if(!instance_){instance_=T

c++模板递归双链表错误gcc(但clang++接受)

此示例代码:#include#includetemplatestructWrapper{staticconststd::string_str;typedefconstWrapperNextType_t;//templaterecursionstaticNextType_t_nxt;typedefconstWrapperPrevType_t;//templaterecursionstaticPrevType_t_prev;};templateconststd::stringWrapper::_str=std::to_string(i);templatetypenameWrapper::N