2

为什么

int enif_compare(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs)

需要使用而不仅仅是

if( lhs == rhs ) return 1;

我相信我比较原子很重要。

4

1 回答 1

4

ERL_NIF_TERM 是一种不透明的数据类型,据我所知,它更类似于指针而不是值。事实上,这里是定义:(typedef unsigned long ERL_NIF_TERM技术上有一些变体,但它们都是整数,与系统上的内存地址大小相同

因此,您必须使用 enif_compare,原因str_cmp与比较 C 字符串时必须使用的原因相同:引用的值可能相同,但您获得的值并不代表这一点。

考虑:

char a[] = "test";
char b[] = "test";
printf("%d\n", a == b);

从逻辑上讲,您和我都知道字符串是相同的,但值ab实际上是指向所包含值的指针。因此,当您进行常规比较 ( ==) 时,它比较的是指针,而不是基础值。由于它们在函数中是不同的值,因此它们被分配到不同的内存地址,因此,a != b, 但是str_cmp(a, b) == true

于 2013-02-04T19:20:46.887 回答