因此,我将 ea 建议标记为“答案”,因为我认为这可能是总体上最好的主意。尽管我认为 cmock 建议在库开发由测试失败驱动的 tdd 方法中非常有效,但我最终可能会尝试这样做。但是现在,我需要一种以交互方式工作的更快+更脏的方法(有问题的库是另一个交互式程序的动态加载插件,我正在尝试对 api 调用的序列进行逆向工程......)
所以我最终做的是编写一个调用pycparse的python脚本。我会将它包括在这里以防它对其他人有所帮助,但它根本不是通用的(例如,假设所有函数都返回 int,并且有一个技巧可以避免在 typedefs 中使用 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, "%s\\n"); return 0;}' % node.type.declname
print '#include "myheader.h"'
print '#include <stdio.h>'
ast = parse_file('myheader.h', use_cpp=True)
FunctionVisitor().visit(ast)