C++ 叮当作响';s AST解析器将未知类型名称视为int

C++ 叮当作响';s AST解析器将未知类型名称视为int,c++,c,parsing,clang,C++,C,Parsing,Clang,我尝试使用clang的ParseAST()和ASTConsumer提取源文件中的所有c函数声明,然后将这些函数声明输出到另一个文件中 除非存在未知的类型名,否则一切都很好。比如说, my_type foo(int x) { /*...*/ } // "my_type" is just a type identifier whose definition is missed in this translation unit. 当我在RecursiveASTVisitor::VisitFun

我尝试使用clang的ParseAST()和ASTConsumer提取源文件中的所有c函数声明,然后将这些函数声明输出到另一个文件中

除非存在未知的类型名,否则一切都很好。比如说,

my_type foo(int x) { /*...*/ }    // "my_type" is just a type identifier whose definition is missed in this translation unit.
当我在RecursiveASTVisitor::VisitFunctionDecl()中使用getReturnType()时,它将返回类型“int”。所以我的程序会输出

int foo(int x);
而不是

my_type foo(int x);
我很好奇为什么
“我的类型”
会被解析为
int
类型。 在分析此源代码时,clang将报告一个错误,称为错误:

未知类型名称“我的类型”


。所以我认为clang知道它是一种类型(我认为未知类型也是一种类型)。

如果声明无效(因为未知的返回类型),解析器可能会假设
foo
没有被声明?在本例中,
foo
是一个未声明的函数,它接受任意参数(与未声明类型的函数一样),并返回一个
int
。您是否在允许clang解析的代码中包含
my_type
的定义?@MortenJensen:我不想包含my_type的定义。只是想让它成为一个未知的类型。我的观点是,既然解析器知道它确实是一种类型,尽管“未知”,那么就让它保持原样不是更好吗?@waiwai444我知道你要去哪里,但请记住,Clang解析器可能是为了首先解析使用有效C构建的程序,然后进行静态分析而构建的。我猜它源于C标准:
函数的默认返回值是int。换句话说,除非明确指定,否则编译器的默认返回值将是函数的整数值。
-因此,当您省略
my\u type
的定义时,它默认为
int
@MortenJensen:您是对的。但我认为这是关于语义,而不是语法。但是如果clang的AST是这样设计的,并且没有办法改变这个特性,那么我别无选择,只能找到其他工具来实现我的目标,也许可以使用lex和yacc来生成我自己的AST。非常感谢。