获取函数原型的简便方法?

4 c++ compiler-construction

嘿伙计们,朋友和我正在讨论想象和真实的语言,如果我们中的一个人想要为另一种语言生成标题(也许D 已经有了一个工具),那么问题就出现了,这将是一个简单而且非常好的方法.做这个?

我们中的一个人说要扫描C文件和标题并忽略函数体,只计算内部的大括号以确定函数何时完成.对此的反击是typedef,定义(括号但定义被认为是一个微不足道的问题)和模板+专业化.

另一个解决方案是读取二进制文件,而不是实际的exe文件,而是链接器使用的目标文件.与此相反的是格式和复杂性.我们都不知道任何对象格式,所以我们无法估计(我们考虑的是gcc和VS c ++).

你们有什么感想?哪个更容易?这应该用合理的逻辑和事实来支持.

如果有人可以链接到一个有用的项目,那么解析C文件/标题并输出它或者读取elf数据并在示例项目中显示信息的项目将非常有用.我试过谷歌搜索,但我不知道它会被称为什么.我找到了libelf但是此刻我无法编译它.我或许可以很快.

vit*_*aut 6

您可以使用clang库来解析C/C++源代码,并在特定的函数原型中提取您想要的任何信息.

由于基于库的架构,很容易重用您需要的部分clang.在您的情况下,这些是前端库(liblex,libparse,libsema).我认为这是一种更可行的方法,然后使用手写扫描器考虑您提到的困难(typedef,定义等).

clang也可以用作解析源代码并以XML格式输出AST的工具,例如,如果你有这个文件test.cpp:

void foo() {}

int main()
{
    foo();
}
Run Code Online (Sandbox Code Playgroud)

并调用clang++ -Xclang -ast-print-xml -fsyntax-only test.cpp你将获得test.xml类似于以下的文件(为简洁起见,这里跳过了不相关的部分):

<?xml version="1.0"?>
<CLANG_XML>
  <TranslationUnit>
    <Function id="_1D" file="f2" line="1" col="6" context="_2"
              name="foo" type="_12" function_type="_1E" num_args="0">
    </Function>
    <Function id="_1F" file="f2" line="3" col="5" context="_2"
              name="main" type="_21" function_type="_22" num_args="0">
    </Function>
  </TranslationUnit>
  <ReferenceSection>
    <Types>
      <FunctionType result_type="_12" id="_1E"/>
      <FundamentalType kind="int" id="_21"/>
      <FundamentalType kind="void" id="_12"/>
      <FunctionType result_type="_21" id="_22"/>
      <PointerType type="_12" id="_10"/>
    </Types>
    <Files>
      <File id="f2" name="test.cpp"/>
    </Files>
  </ReferenceSection>
</CLANG_XML>
Run Code Online (Sandbox Code Playgroud)

我不认为从二进制文件中提取此信息至少对于具有C链接的符号是可能的,因为它们没有名称修改.