C ++ Insights是一种基于叮当的工具,可进行源代码转换。 C ++见解的目标是使通常且故意发生在幕后的事情可见。这是关于编译器为我们使事情起作用的魔术。
以此代码为例:
class Base {
};
class Derived : public Base {
};
int main () {
Derived d;
Derived d2 = d;
d2 = d;
Base& b = d;
}没什么特别的,当然,它会编译。这是编译器对此的看法:
class Base
{
public:
// inline constexpr Base() noexcept = default;
// inline constexpr Base(const Base &) noexcept = default;
// inline constexpr Base & operator=(const Base &) noexcept = default;
};
class Derived : public Base
{
public:
// inline constexpr Derived() noexcept = default;
// inline constexpr Derived(const Derived &) noexcept = default;
// inline constexpr Derived & operator=(const Derived &) noexcept = default;
};
int main ()
{
Derived d;
Derived d2 = Derived (d);
d2. operator =(d);
Base & b = static_cast <Base&>(d);
return 0 ;
}您可以看到所有编译器提供的特殊会员功能以及从Derived到Base的升级。
C ++ Insights是一种基于叮当的工具,可进行源代码转换。 C ++见解的目标是使通常且故意发生在幕后的事情可见。这是关于编译器为我们使事情起作用的魔术。或查看编译器的类别。
在2017年,我开始研究C ++ 11,C ++ 14和C ++ 17获得的一些新事物。诸如Lambdas,基于范围的陆面和结构化绑定之类的令人惊奇的事情。我把它放在一起。您可以在线找到幻灯片和视频。
但是,所有的研究以及我的一些培训和教学都使我开始思考如果我们可以用编译器的眼光看待情况。当然,至少有一个AST垃圾场。我们可以看到编译器从C ++源代码段生成的代码,并使用编译器Explorer等工具。但是,我们看到的是汇编器。 AST和编译器Explorer输出都不是我编写代码的语言。因此,我对此输出不太熟悉。另外,当教学生C ++时,展示了AST并解释说这对我来说并不令人满意。
我开始编写一个基于clang的工具,该工具可以将基于范围的FOROP转换为编译器内部版本。然后,我对结构化绑定和lambdas做了同样的事情。最后,我做的比最初计划的要多得多。它显示了调用操作员的位置以及编译器在其中进行一些铸造的地方。 C ++洞察力可以推断auto或decltype背后的类型。目标是生成可编译的代码。但是,这在所有地方都是不可能的。
您可以看到,例如,lambda,基于范围的for-loop或自动的转换。当然,您可以改变任何其他C ++片段。
看到自己。 C ++洞察力可在线获得:cppinsights.io。
尽管如此,还有工作要做。
我没有声称所有的事情正确。目前,我还在研究新标准(例如C ++ 20)的支持功能。请记住,C ++的见解是基于Clang及其对AST的理解。
自从发布C ++洞察以来,我就C ++见解进行了几次演讲。例如,在C ++现在。这是幻灯片和视频。
C ++洞察力可以在Clang源树内部或外部建立。
请参阅readme_windows.md
用extra/clang构建以下额外标志: -DINSIGHTS_USE_SYSTEM_INCLUDES=off -DCLANG_LINK_CLANG_DYLIB=on -DLLVM_LINK_LLVM_DYLIB=on
有关为什么需要关闭INSIGHTS_USE_SYSTEM_INCLUDES的说明,请参见#186。
extra/clang和extra/llvm提供/usr/lib/{libclangAST.so,libLLVM*.a,libLLVM.so} 。 libclangAST.so需要libLLVM.so ,如果链接libLLVM*.a (而不是libLLVM.so ),将会发生冲突。请参阅https://bugs.archlinux.org/task/60512
您需要在搜索路径中安装叮当声。
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build && cd build
cmake -G"Ninja" ../cppinsights
ninja
所得的二进制(见解)可以在build文件夹中找到。
在clang源树中构建C ++洞察力的最简单方法是使用LLVM_EXTERNAL_PROJECTS选项。
git clone https://github.com/llvm/llvm-project.git
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build
cd build
cmake -G Ninja -D=CMAKE_BUILD_TYPE=Release -DLLVM_EXTERNAL_PROJECTS=cppinsights -DLLVM_EXTERNAL_CPPINSIGHTS_SOURCE_DIR=<PATH/TO/cppinsights> [INSIGHTS CMAKE OPTIONS] ../llvm-project/llvm
ninja
CMAKE可以启用一些选项:
| 选项 | 描述 | 默认 |
|---|---|---|
| Insights_Strip | 构建后的带状见解 | 在 |
| Insights_static | 使用静态链接 | 离开 |
| Insights_coverage | 启用代码覆盖范围 | 离开 |
| Insights_use_libcpp | 使用libc ++进行测试 | 离开 |
| 调试 | 启用调试 | 离开 |
似乎最好在配置过程中提供体系结构:
cmake -DCMAKE_OSX_ARCHITECTURES=arm64 ../cppinsights
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build_eclipse
cd build_eclipse
cmake -G"Eclipse CDT4 - Unix Makefiles" ../cppinsights/
然后,在CE开发中 - >一般 - >现有项目中的工作空间。选择build_eclipse 。享受与CE开发的编辑。
使用C ++见解非常简单:
insights <YOUR_CPP_FILE> -- -std=c++17
当涉及到系统路径时,事情变得复杂。这些路径在二进制中是硬编码的,这似乎来自编译器C ++的见解。为此,请查看脚本/getInclude.py。该脚本试图从编译器中收集系统包含路径。没有选项, getinclude.py使用g++ 。您也可以将另一个编译器作为第一个参数传递。
这是一个示例:
./scripts/getinclude.py
-isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1 -isystem/usr/local/include -isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.3.0/include -isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -isystem/usr/include
该脚本可以与C ++见解一起使用:
insights <YOUR_CPP_FILE> -- -std=c++17 `./scripts/getinclude.py`
如果您具有GCC编译器的自定义构建,例如GCC-11.2.0,并且未安装在默认系统路径中的编译器中,则在构建后,Clang未能找到正确的libstdc++路径(GCC的STL)。如果您遇到这种情况,则可以使用“ --gcc-toolchain=/path/GCC-1x.xx/installed/path ”来告诉clang/c ++见解stl:
./cppinsights Insights.cpp -- --gcc-toolchain=${GCC_11_2_0_INSTALL_PATH} -std=c++20
这里“ ${GCC_11_2_0_INSTALL_PATH} ”是您自定义构建的GCC的安装目录。此处描述了Clang的选项。
还有另一个GitHub项目,该项目设置了一个具有最新C ++ Insights版本的Docker容器:C ++ Insights -Docker
这里有一个用于VIM的插件。
Neovim的插件可在此处找到。
Vis Code Marketplace可以找到视觉工作室代码的扩展名:C ++ Insights -VSCODE扩展。
至少对于MacOS,您可以通过Homebrews安装C ++洞察力,这要归功于此格式:
brew install cppinsights
我的目标是将存储库与最新版本的clang编译,至少是以前的版本。该网站试图保持最新版本的Clang。但是,由于某些问题(为Windows建立叮当声),该网站的版本通常会延迟几个月。
我创建了一个YouTube频道,每个月都会发布一个新视频。在这些视频中,我使用C ++见解来显示和解释某些C ++结构,有时我也解释了C ++的见解。
见托多。
如果您想支持该项目,请考虑提交补丁。另一种选择是成为GitHub赞助商或Patreon支持者。