从标题自动生成C代码

我想生成在头文件中定义的过程的空实现。 理想情况下,他们应该为指针返回NULL,为整数等返回0,并且在理想的世界中,还会打印stderr哪个函数被调用。

这样做的动机是需要实现一个包装器,该包装器将复杂的现有API(头文件)的子集调整到另一个库。 API中只有少数程序需要委派,但尚不清楚哪些程序。 所以我希望使用一种迭代方法,在这种情况下,我运行这个自动生成的包装器,查看所谓的内容,使用委托实现它,然后重复。

我看到从头自动生成C ++文件? 但答案似乎是C ++特定的。

因此,对于那些需要以简单的术语阐述的问题的人来说,如何在给定头文件的情况下自动生成这样的实现呢? 我更喜欢现有的工具 - 我现在最简单的解决方案就是使用pycparser。

更新谢谢你们。 两个好的答案。 还张贴我目前的黑客。


UML建模工具能够以选择的语言生成默认实现。 通常还支持导入源代码(包括C头文件)。 你可以尝试导入你的头文件并从中生成源代码。 我个人有Enterprise Architect的经验,它支持这两种操作。


所以,我打算将这个建议标记为“答案”,因为我认为这可能是一般最好的想法。 尽管我认为cmock建议在tdd方法中非常有效,在这种方法中,图书馆开发是由测试失败驱动的,我可能最终会尝试这种方式。 但现在,我需要一个更快捷+更肮脏的方法,以交互方式工作(所讨论的库是另一个动态加载的插件,交互式程序,我试图对api调用的顺序进行逆向工程...)

所以我最终做的是编写一个调用pycparse的python脚本。 我将它包含在它的情况下,以帮助其他人,但它根本不是一般的(假设所有函数都返回int,并且有一个hack来避免typedef中的func defs)。

from pycparser import parse_file
from pycparser.c_ast import NodeVisitor


class AncestorVisitor(NodeVisitor):

    def __init__(self):
        self.current = None
        self.ancestors = []

    def visit(self, node):
        if self.current:
            self.ancestors.append(self.current)
        self.current = node
        try:
            return super(AncestorVisitor, self).visit(node)
        finally:
            if self.ancestors:
                self.ancestors.pop(-1)


class FunctionVisitor(AncestorVisitor):

    def visit_FuncDecl(self, node):
        if len(self.ancestors) < 3: # avoid typedefs
            print node.type.type.names[0], node.type.declname, '(',
            first = True
            for param in node.args.params:
                if first: first = False
                else: print ',',
                print param.type.type.names[0], param.type.declname,
            print ')'
            print '{fprintf(stderr, "%sn"); return 0;}' % node.type.declname


print '#include "myheader.h"'
print '#include <stdio.h>'
ast = parse_file('myheader.h', use_cpp=True)
FunctionVisitor().visit(ast)

警告:这是一个未经研究的答案,因为我自己没有任何经验。

我想你可能会有一些为单元测试设计的模拟框架。 这种框架的一个例子是:cmock

项目页面建议它将从头部生成代码。 然后你可以拿起代码并调整它。

链接地址: http://www.djcxy.com/p/66959.html

上一篇: Automatically Generate C Code From Header

下一篇: How can I read the memory of a process in python in linux?