c++ - caml_hash_varian返回的值在什么范围?

标签 c++ c hash ocaml polymorphic-variants

子章节20.3.6 Polymorphic variants描述了如何在C语言中识别多态变量值(*包含一个错误:应该是caml_hash_variant而不是hash_variant)
我想直接将这些哈希值用作C++中的错误代码。像这样
archive.mli:

...
type t = ...
type err = [`File_not_found | `Archive_is_corrupted]
val opena : string -> (t, err) error
... 
archive.ml
...
let () = Callback.register "open archive" opena
...
archive.cpp:
...
const int Error::File_not_found = caml_hash_variant("File_not_found")
const int Error::Archive_is_corrupted = caml_hash_variant("Archive_is_corrupted")

int Archive::open(char* path) {
  static const value* f = nullptr; \
  if (f = nullptr) 
      f = caml_named_value("open archive");

  value result = caml_callback(*f, caml_copy_string(path));
  if (Tag_val(result) == 0) { // Result.Ok
    archive = Field(caml_state, 0);
    return ??????
  } else { // Result.Error
    return Int_val(Field(caml_state, 0));
  }
}
...
返回错误代码并进行比较没有问题
if (x.open(path) == Error::Archive_is_corrupted) {
...
}
但是我不知道我可以作为返回okt 状态返回什么。 0? -1?
是否存在caml_hash_variant无法返回的任何保证值?

最佳答案

在通常的OCaml实现中,立即值设置为低位,而变量哈希是立即值。因此,如果您正在C++中查看变量哈希值,则可以确保caml_hash_variant永远不会返回值0。
如果您查看代码,则最终值将由Val_int()或Val_long()生成。在这些宏的定义中,您将看到它们保证设置了低位。
我没有对代码进行任何形式的分析,但是值-1在表面上至少可以作为哈希值,因为它的低位已设置。
更新
低位设置在即时值上,作为垃圾收集器的标记。因此,这是一个必须严格遵守的约定。 (恕我直言,这是OCaml实现中许多非常好的设计折衷之一。)

关于c++ - caml_hash_varian返回的值在什么范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63044297/

相关文章:

c++ - 如何用 C++ 11 之前的语法初始化 vector 的 vector ?

c++ - 传递给函数头的指针

c - Fortran 和 C 互操作性 : receive return value from c (calling from Fortran)

c - printf 如何处理转换

javascript - 如何限制哈希长度

c++ - 为 ostringstream 设置最大 double 的正确方法

c++ - 为什么第一个 gets() 在此代码中不起作用?

c - 缓冲区溢出导致终端将额外的字符作为 shell 命令执行

python - .py 文件中的哈希密码

ruby - 访问 Ruby 哈希变量