Cling API可用吗?

时间:2014-06-06 08:18:05

标签: clang llvm llvm-clang cling

如何通过API在我的应用中使用Cling来解释C ++代码?

我希望它提供类似终端的交互方式,而无需编译/运行可执行文件。让我们说我有你好世界节目:

void main() {
    cout << "Hello world!" << endl;
}

我希望API能够执行char* = (program code)并获得char *output = "Hello world!"。感谢。

PS。与ch interpeter example类似的东西:

/* File: embedch.c */
#include <stdio.h>
#include <embedch.h>
char *code = "\
   int func(double x, int *a) { \
      printf(\"x = %f\\n\", x); \
      printf(\"a[1] in func=%d\\n\", a[1]);\
      a[1] = 20; \
      return 30; \
   }";
int main () {
   ChInterp_t interp;
   double x = 10;
   int a[] = {1, 2, 3, 4, 5}, retval;
   Ch_Initialize(&interp, NULL);
   Ch_AppendRunScript(interp,code);
   Ch_CallFuncByName(interp, "func", &retval, x, a);
   printf("a[1] in main=%d\n", a[1]);
   printf("retval = %d\n", retval);
   Ch_End(interp);
}
}

2 个答案:

答案 0 :(得分:4)

最后有一个更好的答案:示例代码!见https://github.com/root-project/cling/blob/master/tools/demo/cling-demo.cpp

你问题的答案是:不。 cling在编译和解释的代码中获取代码并返回C ++值或对象。它不是&#34;字符串/ string out&#34;有点儿的事。那是perl的;-)这就是代码,值出来的样子:

// We could use a header, too...
interp.declare("int aGlobal;\n");

cling::Value res; // Will hold the result of the expression evaluation.
interp.process("aGlobal;", &res);
std::cout << "aGlobal is " << res.getAs<long long>() << '\n';

为迟到的回复道歉!

答案 1 :(得分:1)

通常人们这样做的方式是: [cling$] #include "cling/Interpreter/Interpreter.h" [cling$] const char* someCode = "int i = 123;" [cling$] gCling->declare(someCode); [cling$] i // You will have i declared: (int) 123

API记录在:http://cling.web.cern.ch/cling/doxygen/classcling_1_1Interpreter.html

当然你也可以在cling的运行时创建自己的'嵌套'解释器。 (参见上面的doxygen链接)

我希望它有帮助并回答问题,您可以在test /文件夹下找到更多用法示例。 Vassil