看来你提出了一个有趣的观点。我已经想通了,但由于我现在无法真正测试我的直觉,所以我不能 100% 确定。无论如何,这就是我会做的:
如果我解析你的代码(带有一点扩展来声明一个 kudamono 变量),我可以从这里说:
struct _poire {
int g;
char rouge; // tomate is probably one of your classes so I just changed the type of the field.
};
typedef struct _poire kudamono;
int maFonction(){
kudamono une_poire;
return 0;
}
当 typedef 被解析时,产生的结果如下:
-TypedefDecl 0x23b4620 <line:5:1, col:23> kudamono 'struct _poire':'struct _poire'
当我声明kudamono 类型的变量时,这里是它的 AST-dump 下方:
-VarDecl 0x2048040 <col:2, col:11> une_poire 'kudamono':'struct _poire'
注意:您可以使用此命令行获取代码的 AST Dump,它可以非常方便地了解您的代码将如何被解析:
clang -Xclang -ast-dump -std=c++11 -fsyntax-only test.cpp(如果你想编译一个,只需删除 -std=c++11 file_name.c 文件)
现在,据我了解,我将在VarDecl 和TypedefDecl 之间进行比较:
1°) 这个VarDecl 被命名为 une_poire 并且具有 kudamono 类型,它是 struct 类型的 typedef _poire。
2°) 这个TypedefDecl 被命名为 kudamono 并且具有 struct _poire 类型,它是 类型的 typedef结构体_poire
所以,奇怪的部分就在这里。 struct _poire 被认为是来自 struct _poire 的 typedef。
你会注意到我试图用通常的类型创建一个 typedef:
typedef int numbers;
这一次,AST-dump 产生:
TypedefDecl 0x25d9680 <line:7:1, col:13> numbers 'int',所以我猜解析器可能对手工类型(通常是结构)有一些问题。
我可以看到一种肮脏的方式来了解您的类型是否是规范的(没有得到误报或误报):
检查 QualType 和规范 QualType 是否不相同
我不知道Qualtype 之间的简单'=' 是否会产生误报或误报(因为我无法测试),但您仍然可以将类型名称与strcmp 进行比较
所以,总结一下:
- 您对规范类型的理解很好。
- Clang 似乎对手工类型有一些问题,但使用普通类型的 Typedef 应该没问题(例如
typedef int int32_t)。
- 当你想知道一个类型是否规范时,你可以将类型的名称与规范类型的名称进行比较,但这很脏。在通常的类型上,isCanonical() 效果很好。