簡體   English   中英

如何將字符串從 C++ 傳遞給 OCaml

[英]How to pass string to OCaml from C++

我在谷歌上沒有找到任何關於此的內容,所以我正在回答我自己的問題:

如何將字符串從 C++ 傳遞給 OCaml?

給定 C++ 代碼,我如何調用 OCaml 代碼並傳遞該字符串?

也適用於 C,只需更改編譯指令:

say_something.ml:

let say_something string = String.concat "" ["OCaml says: "; string]

let () = Callback.register "say_something" say_something

say_something.cc:

#include <stdio.h>
#include <string.h>
#include <caml/mlvalues.h>
#include <caml/callback.h>
#include <caml/alloc.h>


char *say_something(const char *s)
{
  static const value *say_something_closure = NULL;
  if (say_something_closure == NULL) {
    say_something_closure = caml_named_value("say_something");
    if (say_something_closure == NULL) {
      std::exit(1);
    }
  }

  value str = caml_alloc_initialized_string(strlen(s), s);
  /* We copy the C string returned by String_val to the C heap
     so that it remains valid after garbage collection. */
  return strdup(String_val(caml_callback(*say_something_closure, str)));
}

主.cc:

#include <stdio.h>
#include <caml/callback.h>

extern char* say_something(const char* s);

int main(int argc, char ** argv)
{
  char* result;

  /* Initialize OCaml code */
  caml_startup(argv);
  /* Do some computation */
  result = say_something("hello world\n");
  printf("%s", result);
  return 0;
}

如何構建:

ocamlopt -output-obj -o s.o say_something.ml
g++ -o hello_world -I $(ocamlopt -where) \
    main.cc say_something.cc s.o $(ocamlopt -where)/libasmrun.a -ldl

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM