c - 如何在不编写完整解析器的情况下将部分源程序转换为库调用?

标签 c parsing translation

举个例子:

假设我有一个非常简单的库,允许从另一种语言 L 调用 C 代码。

为了使用 L 中的 C 代码,您需要更改 C 代码中的某些结构,例如将函数类型更改为 void,将函数参数替换为单一库类型等。因此您的 C 代码可能会从下面这样更改:

double foo(double bar, double baz) {
  return bar + baz;
}

像这样:

void foo(LibraryArgs args) {
  double bar = args.get(1);
  double baz = args.get(2);
  setReturn(baz + bar);
}

现在可以从 L 调用您的函数了。

我正在尝试编写一个程序,当它看到一个标有某种注释的函数时自动执行此转换,可能是这样的:

@MakeCallableFromL
double foo(double bar, double baz) {
  return bar + baz;
}

但除了为 C 编写一个近乎完整的解析器之外,我似乎找不到解决方案。是否有更简单的方法来解决此类问题?

最佳答案

那里有很多解析包装器生成器,其中最主要的是这些 SWIG(很棒,同时又很糟糕)。

如果您不能使用 SWIG 或类似现有解析器的东西:

我会完全避免更改原始代码——无论如何,C 函数必须是外部可见的,因此直接获取完成的共享对象并从中提取符号并从头开始生成包装代码要容易得多.

根据您的框架,有不同的选择可以做到这一点。对于 gccnm 将是首选工具,或者 objdump -tobjdump -T

因为您要求开销:可以忽略不计;编译器会自动优化掉大部分可能发生的不必要的事情。

关于c - 如何在不编写完整解析器的情况下将部分源程序转换为库调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30850331/

相关文章:

c - PETSc 卡在 MatView() 上

c++ - 合并静态库时 ar 命令不产生索引

c++ - boost-spirit 解析器 lex->qi : Getting the "undocumented" on_success mechanism to work

python - 在 Django 中翻译文件时的 Git 命令

symfony - JMSi18nRoutingBundle 语言选择器

vb.net - ATN 从 QBasic 到 VB.Net

c - write() 的包装函数未按预期工作

使用先前传递的参数在地址处调用函数

c++ - 使用 Boost.spirit 解析一个简单的重复文本宏

java - 用于递归结构的json解析器