使用 gcc 插件获取 class 注释
Get class annotation using gcc plugins
我正在创建一个 gcc plugin 来分析 C++ 文件。
该插件遍历 classes 并生成一些关于它们的信息。
插件正在运行,这就是我浏览 classes.
的方式
cp_binding_level* level(NAMESPACE_LEVEL(nameSpace));
for (decl = level->names; decl != 0; decl = TREE_CHAIN(decl)) {
tree type(TREE_TYPE(decl));
tree_code dc(TREE_CODE(decl));
tree_code tc;
if (dc == TYPE_DECL&& tc == RECORD_TYPE &&
!DECL_IS_BUILTIN (decl) && DECL_ARTIFICIAL (decl)) {
//Now we know this is a class
//Do something
}
}
我想选择class他可以分析哪一个,不能分析哪一个。
我的第一个想法是添加某种注释,我会在解析 class 时阅读它,然后决定是否分析它。
我从未在 C++ 中使用过任何类型的注释,所以我不知道这是否可行。如果是这样,您会如何推荐我使用它们,并在插件中获取注释?
如果不是,有什么好的方法可以满足我的需要吗?
可以做到,不太难,而且用GCC插件也很常见。
首先您必须注册一个新属性。 GCC 提供 PLUGIN_ATTRIBUTES
回调作为方便的时间。然后您的回调函数可以调用 register_attribute
来注册属性。这里是 documented in the manual,距离您 link 前往的地点仅一 link。
使用此函数,您可以注册另一个在应用您的属性时调用的回调。您必须阅读一些 GCC 头文件或源代码才能真正理解此函数应该做什么。但是,它可以很容易地跟踪它是否正在应用于 class,如果是,请记录下来以供以后处理。
我正在创建一个 gcc plugin 来分析 C++ 文件。 该插件遍历 classes 并生成一些关于它们的信息。 插件正在运行,这就是我浏览 classes.
的方式 cp_binding_level* level(NAMESPACE_LEVEL(nameSpace));
for (decl = level->names; decl != 0; decl = TREE_CHAIN(decl)) {
tree type(TREE_TYPE(decl));
tree_code dc(TREE_CODE(decl));
tree_code tc;
if (dc == TYPE_DECL&& tc == RECORD_TYPE &&
!DECL_IS_BUILTIN (decl) && DECL_ARTIFICIAL (decl)) {
//Now we know this is a class
//Do something
}
}
我想选择class他可以分析哪一个,不能分析哪一个。 我的第一个想法是添加某种注释,我会在解析 class 时阅读它,然后决定是否分析它。
我从未在 C++ 中使用过任何类型的注释,所以我不知道这是否可行。如果是这样,您会如何推荐我使用它们,并在插件中获取注释? 如果不是,有什么好的方法可以满足我的需要吗?
可以做到,不太难,而且用GCC插件也很常见。
首先您必须注册一个新属性。 GCC 提供 PLUGIN_ATTRIBUTES
回调作为方便的时间。然后您的回调函数可以调用 register_attribute
来注册属性。这里是 documented in the manual,距离您 link 前往的地点仅一 link。
使用此函数,您可以注册另一个在应用您的属性时调用的回调。您必须阅读一些 GCC 头文件或源代码才能真正理解此函数应该做什么。但是,它可以很容易地跟踪它是否正在应用于 class,如果是,请记录下来以供以后处理。