gpt4 book ai didi

c++ - 如何在 C/C++ 源代码中公开 typedef?

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:26 24 4
gpt4 key购买 nike

我想用我的原始解析器解析 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com