首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

斩获 3.4k+ Star 的 C++ Insights:用编译器的视角看源码!

2017 年,我开始研究 C++11、C++14 和 C++17 带来的一些新特性,如 lambda 表达式、基于范围的 for 循环和结构化绑定等。...于是,我开始着手编写一个基于 Clang 的工具,可将基于范围的 for 循环转换为编译器内部版本。接着,我对结构化绑定和 lambda 也做了同样的处理。最终,我的工作超出了最初计划。...从源代码构建和安装 Clang 需要有 Clang 库和 llvm-config.exe 来设置 CMake。.../cppinsights 4、使用方法 使用 C++ Insights 非常简单: insights -- -std=c++17 当涉及到系统包含路径时,情况就变得复杂了.../scripts/getinclude.py` 自定义 GCC 安装 如果你用的是自定义版本的 GCC 编译器,例如 gcc-11.2.0,且未安装在编译器的默认系统路径中,那么在构建后,Clang 将无法找到正确的

41310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++ 动态新闻推送 第26期

    直达 boost 1.77版本出了,一些改动 asio重大更新 增加协程支持 支持取消异步任务 filesystem重大更新 引入v4,适配std::filesysterm 新增两个库 describe和lambda2...describe是个宏反射库,不多说 lambda2有点像第九期提到的A Macro-Based Terse Lambda Expression 看例子 #include lambda2...addFloat: 10.1 addInt: 8 从c++17开始,规定了这个求值顺序 再比如 std::cout << a() << b() << c(); 这个a b c可以是任意调用顺序,反正最终输出无所谓...,但你可能有隐含依赖 在c++17之后,强制要求a b c 这里列一下顺序 a.b a->b a->*b a(b1, b2, b3) // b1, b2, b3 - in any order b @...thread,其实和上面的taskflow差不太多,他实现了一个库concoro 演示代码在这里https://github.com/lucteo/cppnow2021-examples/blob/main

    59720

    xmake从入门到精通9:交叉编译详解

    注:如果存在CC/CXX环境变量的话,会优先使用当前环境变量中指定的值。 如果指定的编译器名不是那些xmake内置可识别的名字(带有gcc, clang等字样),那么编译器工具检测就会失败。...这个时候我们可以通过: xmake f --cxx=clang++@/home/xxx/c++mips.exe 设置c++mips.exe编译器作为类clang++的使用方式来编译。...这里我们追加了-v参数,看了下详细的编译命令和检测到的mingw工具链配置值,其中cross被自动检测为:x86_64-w64-mingw32-,bin目录也被自动检测到了,还有编译器和链接器也是。...,就不用额外指定mingw工具链路径了,方便使用。...++") 强制test目标的编译器和链接器使用clang编译器,或者指定交叉编译工具链中的编译器名或者路径。

    1.8K30

    MIT 6.S081Fall 2020 搭建risc-v与xv6开发调试环境

    2022-01-19日更新 很多人用 M1 架构编译都出现了错误 然后我同样复现了错误并且找到了解决办法 更详细的描述了不同的安装过程 本篇文章主要记录一下学习MIT6.S081课程部署实验环境的详细过程...6.S081/2020/ 我的环境: 电脑型号:MacBook Pro (14-inch, 2021) 系统版本:macOS Monterey 12.1 我的笔记本是 arm64(M1芯片) 架构的,但此篇文章适用于.../ LLVM + CLANG(可选) Mac 默认情况下预装的环境是 LLVM+CLANG 而不是 GCC 虽然有 GCC 的命令 但是其实是 CLANG 测试如下 执行 gcc -v: gcc -v...,我亲测都可以编译成功,所以这个地方可以保持默认,如果需要安装GCC 来替换 LLVM + CLANG 可以按照以下步骤操作: # 安装 brew install gcc # 版本为gcc 11.2.0..._3 # 设置环境变量: # 把以下内容添加到 ~/.zshrc 或者 ~/.bash_profile 或者 /etc/profile # 因为我使用的是zsh 所以配置到 ~/.zshrc 里 vim

    2.3K12

    android native内存检测方案(二)

    它采用 了底层虚拟机作为其后端。它的目标是提供一个 GNU 编译器套装 (GCC)的替代品, 作者是克里斯·拉特纳,在苹果公司的赞助下进 行开发。...AddressSanitizer 是 clang 中的一个内存错误检测器,它可以检测到 以下问题: Out-of-bounds accesses to heap, stack and globals Use-after-free...译 代 码 时 用 -fsanitize=address 就 能 打 开 AddressSanitizer 工具,为了在检测到内存错误时打印出您的程序调 用栈,需要在编译时加上选项 -fno-omit-frame-pointer...介绍 /docs/source.android.com/src/devices/tech/debug 里 面 , 有 个 asan.jd 我们使用网页打开 主要介绍了检测都可以完成哪些目标  Building...UndefinedBehaviorSanitizer UndefinedBehaviorSanitizer 说白了也是 clang 的一种检测方式,检测代码中未初始化, 未赋值等等一系列的错误使用.

    4.6K100

    iOS编译简析

    LLVM 历史 早期 iOS 选用的是当时一家独大的 GCC 编译器作为 OC 语言的前端,但是随着时间的推移,Apple 为 OC 增加了很多特性,想要 GCC 给与实现,但是 GCC 却并没有支持,...并且 GCC 本身代码耦合度较高,模块独立性比较差,并且《GCC运行环境豁免条款》限制了LLVM-GCC。...iOS 在 Xcode 5 版本前使用的是 GCC ,在 Xcode 5 中将 GCC 彻底抛弃,替换为了 LLVM ,这期间也是慢慢过渡过来的,由开始使用 GCC 编译->GCC 与 LLVM 共存-...主要子项目: LLVM 核心库 编译器前端 Clang LLDB libc ++和 libc++ lld Clang Clang 是 LLVM 项目的一个子项目,是 C 系列(C、C++、OC)的编译器前端...由 Clang 中 Parser 和 Sema 配合完成; 静态分析(Static Analysis):使用它来表示用于分析源代码以便自动发现错误; 中间代码生成(Code Generation):开始

    1.4K20

    C11与C99的变化对比

    2011年12月8日,国际标准化组织(ISO)和国际电工委员会  (IEC)旗下的C语言标准委员会正式发布了C11标准。  C11标准的最终定稿草案是免费开放的,但是正式标准文件是需要付费的。 ...当前,支持此标准的主流C++编译器有:GCC、Clang、Intel C++ Complier等。 ..._Atomic类型修饰符和 头文件   10.带边界检查(Bounds-checking)的函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等...尽管遵循GNU C标准规范的编译器(GCC以及Clang等)使用了C扩展关键字__fp16,但是只能对半精度浮点数进行引用,而不能做任何算术操作。...2、匿名函数:匿名函数,也叫lambda表达式,是现代计算机编程语言的一个典范特性,在Clang编译器中已经通过blocks语法 [4]  进行了支持,该语法也被发表到了下一代C标准的提案 [5-6]

    2.2K00

    xmake v2.3.4 发布, 更加完善的工具链支持

    但是这样的话,一些windows平台特有的设置就丢失了,而且用户也没法使用if is_plat("windows") then来判断windows平台做特定的设置。...这也是推荐做法,因为像gcc/clang等大部分编译工具链,编译器和链接器都是配套使用的,要切就得整体切,单独零散的切换设置会很繁琐。...设置构建行为策略 xmake有很多的默认行为,比如:自动检测和映射flags、跨target并行构建等,虽然提供了一定的智能化处理,但重口难调,不一定满足所有的用户的使用习惯和需求。...gcc/clang下可以正常处理,但是msvc下就不支持了 也许我们能通过if is_plat() then来分平台处理,但很繁琐,因此xmake内置了flags的自动映射功能。...基于gcc flags的普及性,xmake采用gcc的flags命名规范,对其根据不同的编译实现自动映射,例如: add_cxflags("-O0") 这一行设置,在gcc/clang下还是-O0,但如果当前是

    1.4K20

    代码的“真面目”---如何查看cpp预处理后程序代码

    但使用宏定义后,宏在预处理阶段才展开,会造成代码阅读的不便;尤其是宏嵌套,会极大加深代码阅读和了解难度。 [恐怖的宏定义] 用宏封装后,使用起来会非常方便。但是第一次阅读时,会比较难以理解。...但是查询资料后发现,ninja为了提升构建速度,既没有默认生成这些中间文件,也没有生成这些中间文件的任务。同时gcc/clang最新的构建流程中,也不会生成这些中间文件。...因为使用的是CMake,需要设置CMAKE_C_FLAGS和CMAKE_CXX_FLAGS;前者是对c文件生效,后者是对cpp文件生效。...到这一步,对于所有的CMake+gcc/clang构建系统,都可以方便快捷的生成预处理文件了。...既然我们都知道gcc/clang的编译参数-save-temps=obj,那么只要把这个选项设置进c和cxx的编译参数中即可。

    6K41

    华中科大提出YOLOOC | 源于 YOLO又高于YOLO,任何类别都不在话下,误检已是过往

    OWOD设置比现有的闭集设置更现实,最初在[14]中提出,但尚未明确定义。在它们的问题设置中存在两个问题: 训练集中出现了一些新类别; 由于缺乏真实标签,出现了一些假阳性。 这两种情况都是不现实的。...针对实际应用,重建了一个在训练集中不存在新型类别的数据集,设定了评估指标,引入了标签平滑,提出了阈值校准方法以校正新型类别的误检,将YOLOv5扩展到开放世界目标检测(OWOD),验证了所提模型和模块的有效性...YOLOOC使用带有校准的标签平滑。表1展示了在我们的数据分割和评估中,YOLOOC,ORE [14](没有依赖带有强烈新对象监督的留出验证数据的能量基新识别器),和OW-DETR [8]的性能。...YOLOOC在没有校准的情况下使用标签平滑。具体来说,我们遵循[2]的协议,该协议在闭集(VOC 2007测试集)和开放集设置(将数量相等的来自COCO 2017训练集的图像添加到闭集中)上评估模型。...理想的模型是在闭集设置中性能高(即100),并且在开放集设置中性能没有下降(即0)。

    93110

    LLVM编译过程

    3、Xcode编译器发展过程 Clang 是 LLVM 的子项目,是 C、C++ 和 Objective-C 编译器,目标是替代传统编译器 GCC 。...我们以 Xcode 为例,Clang 编译 Objective-C 代码的速度是 Xcode 5 版本前使用的 GCC 的3倍,其生成的 AST 所耗用掉的内存仅仅是 GCC 的五分之一左右。...4.2版本; Xcode5:GCC被废弃,新的编译器是LLVM 5.0,从GCC过渡到Clang-LLVM的时代正式完成,Objective-C与swift都采用Clang作为编译器前端 4、Clang-LLVM...静态分析(Static Analysis):静态分析会对代码进行错误检查,如出现方法被调用但是未定义、定义但是未使用的变量等,以此提高代码质量。...链接(Link):上个阶段生成的目标文件和引用的静态库链接起来,最终生成可执行文件(Mach-O 类型),链接器解决了目标文件和库之间的链接。 其中,12345属于前端,6属于优化,78属于后端。

    2K10

    如何在编码阶段减少代码中的bug?

    静态分析工具能够在代码未运行的情况下分析源代码,发现代码中的bug。在C/C++程序中,静态分析工具可以发现程序错误,如空指针取消引用、内存泄漏、被零除、整数溢出、越界访问、初始化前使用等。...Clang是一个优秀的静态分析器,能够分析代码中潜在的问题。对于上面的问题,GCC 在编译时加上-Wall 和-Wpedantic编译选项也可以分析出bug。...和GCC的主要任务是编译代码,静态分析也并不是在每次编译时都需要,而且编译器在做静态分析时需要花费大量的时间。...比如空指针,除零,整数溢出,无效的移位操作,无效的转换,STL的无效用法,内存管理,空指针引用,越界检查,未初始化的变量,未使用或者重复的代码等。...GCC编译代码,并没有报出任何警告和错误。

    1.3K30

    转载:【AI系统】传统编译器发展

    LLVM 和 GCC 不仅提供了一系列编译器,也主要提供了一些 C/C++ 语言相关配套工具,如 LLVM 的 Clang 工具链(包含 Clang-tidy、Clang-format)。...另一方面,GCC 的代码耦合度太高,不好独立,而且越是后期的版本,代码质量越差,但 Apple 想做的很多功能(比如更好的 IDE 支持)需要模块化的方式来调用 GCC,但 GCC 一直没有实现,从根本上限制了...这样比较 Clang 和 GCC 是不公平的,因为 GCC 没有在本地支持 Windows 的计划。代码复杂度:GCC 是一个非常复杂的软件,有超过 1500 万行代码。...GCC 则没有语言独立类型系统的设计目标。前端解析器:GCC 以前有基于 Bison 的 LR 解析器,后来转向了手写递归下降解析器。Clang 一直使用手写的确定性递归下降解析器,且可回溯。...构建工具:Clang 与 GCC 的另一个大的区别。GCC 使用 Autotools 和 Make 作为构建工具,而 Clang/LLVM 使用 CMake。

    10400

    应用 AddressSanitizer 发现程序内存错误

    过去常用的工具是 Valgrind,但使用 Valgrind 最大问题是它会极大地降低程序运行的速度,初步估计会降低 10 倍运行速度。...不过这里要注意内存泄漏的检测只会在程序最后退出之前进行检测,也就是说如果你在运行时如果不断地分配内存,然后在退出的时候对内存进行释放,AddressSanitizer 将不会检测到内存泄漏,这种时候可能你就需要另外的工具了...简单来说就是保存了主存元信息的一块内存,比如主存的那些区域被 posioned 都是在 Shadow memory 中保存的 AddressSanitizer 和其他内存检测工具对比 下图是 AddressSanitizer...当前 AddressSanitizer 支持 GCC 以及 Clang,其中 GCC 是从 4.8 开始支持,而 Clang 的话是从 3.1 开始支持。...但像 american fuzzy lop 这样的模糊测试工具就会对模糊化的软件使用内存进行限制,不过你仍可以通过禁用内存限制来解决该问题。

    2.7K41
    领券