GCC插件识别typedef/using疑问:MyInt为何是integer_type而非TYPE_DECL?
解释GCC插件中typedef识别为integer_type的原因
- GCC的AST(抽象语法树)体系里,
typedef int MyInt;对应的语法节点本身确实是TYPE_DECL,但你看到的integer_type是这个TYPE_DECL节点所关联的目标类型,而非节点自身的类型。 - 你大概率是误将获取节点关联类型的操作(比如调用
TREE_TYPE(decl))当成了判断节点自身类型的操作。要判断节点是不是typedef对应的声明,应该用TREE_CODE(decl)来检查,此时会返回TYPE_DECL;而TREE_TYPE(decl)返回的是这个typedef所指向的原始类型(这里就是int对应的integer_type)。 - 对于C++的
using MyInt = int;类型别名,GCC的AST处理逻辑和typedef完全一致,同样会生成TYPE_DECL节点,其关联类型为被别名的原始类型。 - 产生混淆的核心原因是GCC树节点体系的设计:每个声明节点(DECL)都绑定了一个关联类型(TREE_TYPE),而TYPE_DECL是专门用来表示类型声明/别名的节点类型,它的作用就是把标识符绑定到某个类型上,所以关联类型自然就是被别名的那个类型。
举个插件里正确识别typedef的代码示例:
// 假设遍历到某个树节点decl if (TREE_CODE(decl) == TYPE_DECL) { // 检查是否是typedef或using别名 if (TYPE_DECL_IS_TYPEDEF(decl)) { tree target_type = TREE_TYPE(decl); // 这里得到integer_type const char* alias_name = IDENTIFIER_POINTER(DECL_NAME(decl)); // 得到"MyInt" fprintf(stderr, "找到类型别名: %s,目标类型代码: %s\n", alias_name, get_tree_code_name(TREE_CODE(target_type))); } }
GCC官方文档对AST节点细节的描述确实零散,核心要区分**节点自身的代码(TREE_CODE)和节点关联的类型(TREE_TYPE)**这两个概念,你之前看到的integer_type是关联类型的代码,而非节点本身的类型。
内容的提问来源于stack exchange,提问作者Guillaume17
相关产品推荐
相关产品推荐

