- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想用我的原始解析器解析 C/C++ 代码以获得 ast-tree。
但它不支持宏和类型定义。
在 gcc 选项的帮助下,可以在任何 C/C++ 项目中公开宏定义。之后,我自己的解析器能够处理 C/C++ 代码,但前提是其中没有 typedef。
所以,我想以某种方式摆脱 typedef。但是我不知道,我该怎么办。
我想替换重新定义的类型名称,例如:
typedef char CHAR;
typedef int& INT;
INT a;
CHAR b;
他们的原创:
int &a;
char b;
因此,我想获得相同的来源,但使用原始类型,没有 typedef。
我想,这对于编译器来说是非常简单的任务,但对于学生的项目来说却不是。 :)
据我所知,g++ 的 DECL_ORIGINAL_TYPE (TYPE_NAME (t)) 指向具有原始对象类型的树节点。但我真的不想深入研究 g++ 源代码来满足我的需求。
那么,揭示 typedef 最简单的方法是什么?
如有任何帮助,我们将不胜感激。
已编辑:
用GCCXML的解决方案真的很好,但是我还是不明白,怎么弄来自它的 XML 表示的 C/C++ 代码。你能解释一下,我应该怎么做才能转换 XML:
(an example from http://www.gccxml.org/HTML/example1out.html)
<?xml version="1.0"?>
<GCC_XML>
<Namespace id="_1" name="::" members="_2 _3 _4 "/>
<Function id="_2" name="main" returns="_5" context="_1" location="f0:8"/>
<Function id="_3" name="a_function" returns="_5" context="_1" location="f0:4">
<Argument name="f" type="_6"/>
<Argument name="e" type="_4"/>
</Function>
<Struct id="_4" name="EmptyClass" context="_1" location="f0:1" members="_7 _8 " bases=""/>
<FundamentalType id="_5" name="int"/>
<FundamentalType id="_6" name="float"/>
<Constructor id="_7" name="EmptyClass" context="_4" location="f0:1">
<Argument name="_ctor_arg" type="_9"/>
</Constructor>
<Constructor id="_8" name="EmptyClass" context="_4" location="f0:1"/>
<ReferenceType id="_9" type="_4c"/>
<File id="f0" name="example1.cxx"/>
</GCC_XML>
回到 C/C++:
(an example from http://www.gccxml.org/HTML/example1in.html)
struct EmptyClass {};
int a_function(float f, EmptyClass e)
{
}
int main(void)
{
return 0;
}
你能解释一下吗?
最佳答案
因为类型是一个很大的复杂参数,我建议使用 GCCXML .它是一个从具体源代码生成抽象语法树的前端。我用它来生成接口(interface) Prolog/OpenGL。如果您想充分利用它,您将需要一个好的 XML 阅读器(SWI-Prolog 在这方面非常擅长)。
编辑
下面的微文件x.c
typedef struct A {
int X, Y;
} T;
T v[100];
处理
gccxml -fxml=x.xml x.c
在 x.xml 中(以及许多其他内容)生成以下 xml 语句
...
<Variable id="_3" name="v" type="_141" context="_1" location="f0:5" file="f0" line="5"/>
...
<Struct id="_139" name="A" context="_1" mangled="1A" demangled="A" location="f0:1" file="f0" line="1" artificial="1" size="64" align="32" members="_160 _161 _162 _163 _164 _165 " bases=""/>
<Typedef id="_140" name="T" type="_139" context="_1" location="f0:3" file="f0" line="3"/>
<ArrayType id="_141" min="0" max="99u" type="_140" size="6400" align="32"/>
...
<Field id="_160" name="X" type="_147" offset="0" context="_139" access="public" location="f0:2" file="f0" line="2"/>
<Field id="_161" name="Y" type="_147" offset="32" context="_139" access="public" location="f0:2" file="f0" line="2"/>
<Destructor id="_162" name="A" artificial="1" throw="" context="_139" access="public" mangled="_ZN1AD1Ev *INTERNAL* " demangled="A::~A()" location="f0:1" file="f0" line="1" endline="1" inline="1">
</Destructor>
您可以看到,在 type="..."符号链之后,您可以重构分配给 typedef 的类型。
关于c++ - 如何在 C/C++ 源代码中公开 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14810314/
我是一名优秀的程序员,十分优秀!