草庐IT

c++ - 如何制作干净的clang前端?

我正在开发一个C++源代码分析器项目,看来clang是一个不错的候选者解析工作。问题是clang严重依赖基础设施“llvm”项目,如何配置它以获得干净的前端,而无需任何面向具体机器的后端?就像LCC一样,它们为专注于解析器部分的人提供了一个“空”后端。任何建议表示赞赏。 最佳答案 我最近在Windows上做了这个。从here下载clang和llvm源代码.安装cmake和Python(与文档相反,您确实需要Python来构建clang;至少,如果cmake找不到Python运行时,它会放弃)。您还需要VS2008或VS2010。有一

c++ - 如何制作干净的clang前端?

我正在开发一个C++源代码分析器项目,看来clang是一个不错的候选者解析工作。问题是clang严重依赖基础设施“llvm”项目,如何配置它以获得干净的前端,而无需任何面向具体机器的后端?就像LCC一样,它们为专注于解析器部分的人提供了一个“空”后端。任何建议表示赞赏。 最佳答案 我最近在Windows上做了这个。从here下载clang和llvm源代码.安装cmake和Python(与文档相反,您确实需要Python来构建clang;至少,如果cmake找不到Python运行时,它会放弃)。您还需要VS2008或VS2010。有一

c++ - 是否应该通过 std::cin 将负数读入 unsigned 失败(gcc,clang 不同意)?

例如,#includeintmain(){unsignedn{};std::cin>>n;std::cout输入-1时,clang6.0.0输出00而gcc7.2.0输出42949672951。我想知道谁是正确的。或者也许两者都是正确的标准没有指定这一点?如果失败,我的意思是(bool)std::cin被评估为假。clang6.0.0也无法输入-0。从Clang9.0.0和GCC9.2.0开始,在Clang的情况下使用libstdc++或libc++的两个编译器都同意上述程序的结果,与C++版本无关(>=C++11)使用并打印42949672951即他们将值设置为ULLONG_MAX并

c++ - 是否应该通过 std::cin 将负数读入 unsigned 失败(gcc,clang 不同意)?

例如,#includeintmain(){unsignedn{};std::cin>>n;std::cout输入-1时,clang6.0.0输出00而gcc7.2.0输出42949672951。我想知道谁是正确的。或者也许两者都是正确的标准没有指定这一点?如果失败,我的意思是(bool)std::cin被评估为假。clang6.0.0也无法输入-0。从Clang9.0.0和GCC9.2.0开始,在Clang的情况下使用libstdc++或libc++的两个编译器都同意上述程序的结果,与C++版本无关(>=C++11)使用并打印42949672951即他们将值设置为ULLONG_MAX并

c++ - GCC 和 Clang 不在 C++17 中编译 std::hash<std::nullptr_t>

开启https://en.cppreference.com/w/cpp/utility/hash它说从C++17开始Eachstandardlibraryheaderthatdeclaresthetemplatestd::hashprovidesenabledspecializationsofstd::hashforstd::nullptr_tandallcv-unqualifiedarithmetictypes(includinganyextendedintegertypes),allenumerationtypes,andallpointertypes.所以,一个C++17兼容的编

c++ - GCC 和 Clang 不在 C++17 中编译 std::hash<std::nullptr_t>

开启https://en.cppreference.com/w/cpp/utility/hash它说从C++17开始Eachstandardlibraryheaderthatdeclaresthetemplatestd::hashprovidesenabledspecializationsofstd::hashforstd::nullptr_tandallcv-unqualifiedarithmetictypes(includinganyextendedintegertypes),allenumerationtypes,andallpointertypes.所以,一个C++17兼容的编

c++ - (缺少)使用 C++11 move 语义的性能改进

我已经编写C++11代码很长一段时间了,还没有对其进行任何基准测试,只期望像vector操作这样的东西现在可以通过move语义“更快”。因此,当实际使用GCC4.7.2和clang3.0(Ubuntu12.1064位的默认编译器)进行基准测试时,我得到了非常不满意的结果。这是我的测试代码:编辑:关于@DeadMG和@ronag发布的(好的)答案,我将元素类型从std::string更改了。至my::string没有swap(),并使所有内部字符串变大(200-700字节),这样它们就不会成为SSO的受害者。EDIT2:原因是奶牛。由伟大的评论再次改编代码,从std::string更改存

c++ - (缺少)使用 C++11 move 语义的性能改进

我已经编写C++11代码很长一段时间了,还没有对其进行任何基准测试,只期望像vector操作这样的东西现在可以通过move语义“更快”。因此,当实际使用GCC4.7.2和clang3.0(Ubuntu12.1064位的默认编译器)进行基准测试时,我得到了非常不满意的结果。这是我的测试代码:编辑:关于@DeadMG和@ronag发布的(好的)答案,我将元素类型从std::string更改了。至my::string没有swap(),并使所有内部字符串变大(200-700字节),这样它们就不会成为SSO的受害者。EDIT2:原因是奶牛。由伟大的评论再次改编代码,从std::string更改存

c++ - 缩小转换和初始化列表,哪个编译器是对的?

考虑以下代码:#includeautomain()->int{doublex(7.0);inti{x};std::cout在GCC4.9中编译时,它编译得很好,只有一个警告:warning:narrowingconversionof‘x’from‘double’to‘int’inside{}使用Clang3.3或VC++2013编译会出现编译错误:error:type'double'cannotbenarrowedto'int'ininitializerlisterrorC2397:conversionfrom'double'to'int'requiresanarrowing问题:根据

c++ - 缩小转换和初始化列表,哪个编译器是对的?

考虑以下代码:#includeautomain()->int{doublex(7.0);inti{x};std::cout在GCC4.9中编译时,它编译得很好,只有一个警告:warning:narrowingconversionof‘x’from‘double’to‘int’inside{}使用Clang3.3或VC++2013编译会出现编译错误:error:type'double'cannotbenarrowedto'int'ininitializerlisterrorC2397:conversionfrom'double'to'int'requiresanarrowing问题:根据