使用 Clang 的 libtooling 匹配 #includes(或 #defines)的正确方法是什么?

2023-11-25

我正在编写一个 libtooling 重构工具。我有课,比方说Foo,在名为的标头中定义foo.h。我想看看是否foo.h包含在一个文件中。目前,要检查是否bar.cc包括foo.h,我只是使用匹配recordDecl(hasName("Foo"))。这有效是因为class Foo { ... };将存在于bar.cc预处理后的 AST,如果bar.cc包括foo.h.

但这不起作用,例如,bar.cc包括cat.h包括foo.h。我想bar.cc明确包括foo.h.

此外,我希望能够匹配#define macros.

我编写工具的方式使这两个目标变得不可能,因为我匹配的 AST 已经过预处理。我想做的事情可能吗?我挖了周围PreprocessorClang 的 Doxygen 页面上的类参考,但我还没有找到我要找的东西。


我在深入研究 Clang 的 Doxygen 和代码后发现了这一点。我需要使用PPCallbacks类与Preprocessor班级。下面是一个例子。请注意,这不能保证是功能代码片段,但它说明了一般用法。有关详细信息,请参阅 Clang 的PP回调文档以及以下文档添加PP回调 and 获取PP回调 in clang::预处理器.

class Find_Includes : public PPCallbacks
{
public:
  bool has_include;

  void InclusionDirective(
    SourceLocation hash_loc,
    const Token &include_token,
    StringRef file_name,
    bool is_angled,
    CharSourceRange filename_range,
    const FileEntry *file,
    StringRef search_path,
    StringRef relative_path,
    const Module *imported)
  {
    // do something with the include
    has_include = true;
  }
};

class Include_Matching_Action : public ASTFrontendAction
{
  bool BeginSourceFileAction(CompilerInstance &ci, StringRef)
  {
    std::unique_ptr<Find_Includes> find_includes_callback(new Find_Includes());

    Preprocessor &pp = ci.getPreprocessor();
    pp.addPPCallbacks(std::move(find_includes_callback));

    return true;
  }

  void EndSourceFileAction()
  {
    CompilerInstance &ci = getCompilerInstance();
    Preprocessor &pp = ci.getPreprocessor();
    Find_Includes *find_includes_callback = static_cast<Find_Includes>(pp.getPPCallbacks());

    // do whatever you want with the callback now
    if (find_includes_callback->has_include)
      std::cout << "Found at least one include" << std::endl;
  }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Clang 的 libtooling 匹配 #includes(或 #defines)的正确方法是什么? 的相关文章

  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • JavaScript WeakMap 不断引用经过 gc 处理的对象

    我正在经历 JavaScript 弱映射 在 google chrome 开发者控制台中尝试此代码后 使用 js flags expose gc 运行 我不明白为什么弱映射继续引用 a b 如果 a 是GC 编辑 var a listene
  • Java中Arraylist转Json的方法

    我有一个数组列表 数组列表包含一堆域对象 如下图所示 Domain domainId 19 name a dnsName a com type 0 flags 0 Domain domainId 20 name b dnsName b co
  • 如何在客户端-服务器 PlayN 游戏中处理 RPC?

    我想使用 PlayN 创建客户端 服务器纸牌游戏 例如心 虽然我主要关注 HTML5 输出 但我希望与输出平台无关 以防我将来决定制作 Android 客户端 我应该如何处理RPC机制 这些是我想到的选项 通过 get post 方法将 J
  • Dynamodb:使用两个以上属性的查询

    在 Dynamodb 中 您需要在索引中指定可用于进行查询的属性 如何使用两个以上的属性进行查询 使用 boto 的示例 Table create users schema HashKey id defaults to STRING dat
  • 在 MKMapView 上移动/更新 MKOverlay

    有没有办法更新 即移动 aMKOverlay已经添加到MKMapView 删除旧的并添加新的非常糟糕 慢 即我想当覆盖物在屏幕上移动时触发调用此函数的后台函数 MKOverlayView mapView MKMapView mapView
  • 从远程 git 存储库获取单个文件

    有没有一种方法可以在 Java 中以编程方式从远程 git 存储库下载单个文件 我更喜欢使用尽可能少的带宽的解决方案 最好只下载单个文件 我不需要浏览存储库 我已经有了文件的路径 我更喜欢不依赖于其他应用程序的解决方案 例如 在计算机上安装
  • 如何启动和应用程序选择器

    该应用程序的任务是隐式激活一个单独的应用程序来查看 URL http www google com 因此 应用程序选择器应该出现并让我在至少两个浏览器之间进行选择 默认浏览器将向我显示 www google com 网站 另一个简单的 浏览
  • 需要 C# 中的 BouncyCastle PGP 文件加密示例

    我正在尝试使用我的私钥 ascii 格式 和任何其他公钥 也是 ascii 格式 加密文件 BouncyCastle 库看起来是正确的使用方式 但我找不到 C 的文档 谁能帮我举个例子 谢谢 以下是 BouncyCastle 示例中的一些代
  • 创建不包含外部依赖项的 JAR 文件

    是否可以创建需要外部依赖项的 JAR 文件 而不在 JAR 文件中包含这些依赖项 我的 google fu 未能给我答案 我发现的所有内容都显示了如何将它们包含在 JAR 文件中 但没有显示如何将它们放入清单文件中来表示 我还没有得到它们
  • 如何清除内存以防止VBA中的“内存不足错误”?

    我正在一个大型 Excel 电子表格上运行 VBA 代码 如何清除过程 调用之间的内存以防止发生 内存不足 问题 帮助释放内存的最佳方法是使大对象无效 Sub Whatever Dim someLargeObject as SomeObje
  • C++ 内联类方法导致未定义的引用

    当我尝试内联某个类的方法时 出现编译器错误 当我去掉 inline 关键字时它就起作用了 这是一个简化的示例 主要 cpp include my class h int main MyClass c c TestMethod return
  • 单击时搜索栏的拇指

    我想在搜索栏拇指上注册一个可点击事件 以便在用户单击它时触发事件 是否可以 结合 zwebie 和 Nermeens 的答案得出正确的解决方案 seekbar setOnSeekBarChangeListener new SeekBar O
  • 更好的蜜罐实施(形成反垃圾邮件)

    How do we get rid of these spambots on our site 每个网站都会成为受害者spambots在某一点 您的处理方式会影响您的客户 并且大多数解决方案可能会阻止某些人填写您的表格 这就是蜜罐技术的用武
  • cdk virtualscroll 与 mat-grid-list

    是否有与网格列表一起使用的虚拟滚动实现 我认为默认实现不起作用 因为每一行周围都应该有一个元素 我使用网格列表来显示个人资料图片 并且需要无限滚动或最好是虚拟滚动来加载新图片 因此 由于 cdk virtualscroll 不支持多列 我最
  • PHP/MySQL 数据库查询到底是如何工作的?

    我经常使用MySQL 但我总是想知道它到底是如何工作的 当我得到肯定的结果时 数据到底存储在哪里 例如我这样写 sql SELECT FROM TABLE result mysql query sql while row mysql fet
  • C 在 Windows 上获取系统时间到微秒精度? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中以微秒分辨率测量时间 Hi 有没有一种简单的方法可以获取 Windows 计算机上的系统时间 精确到微秒 查看 GetSystemTimeAsFileTime 它的精度为 0 1 微秒或 1
  • xsl:for-each 有什么不好的地方?

    我一次又一次听到有关如何避免使用 XSLT for each 的说法 应该消除的是你内心的命令式编程恶魔 这有什么不好呢 此最佳实践是否重要取决于sizeXML 的数量 即 100 个节点与 10 000 个节点 之间的本质区别
  • 在 mac os x 10.6.7 上卸载 python 3.2

    根据 python org 的文档 在 mac os 上安装 python 3 2 需要升级到 tcl tk 8 5 9 为了使用 IDLE 由于仓促 我两件事都做了 现在我的朋友告诉我 还不推荐使用 python 3 因为 3 只发布了内
  • 为什么 time.clock 给出的经过时间比 time.time 更长?

    我在 Ubuntu 上使用了一段 python 代码的计时time clock and time time clock elapsed time 8 770 s time elapsed time 1 869 s 我知道 time time
  • 使用 Clang 的 libtooling 匹配 #includes(或 #defines)的正确方法是什么?

    我正在编写一个 libtooling 重构工具 我有课 比方说Foo 在名为的标头中定义foo h 我想看看是否foo h包含在一个文件中 目前 要检查是否bar cc包括foo h 我只是使用匹配recordDecl hasName Fo