为什么
int enif_compare(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs)
需要使用而不仅仅是
if( lhs == rhs ) return 1;
我相信我比较原子很重要。
为什么
int enif_compare(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs)
需要使用而不仅仅是
if( lhs == rhs ) return 1;
我相信我比较原子很重要。
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);
从逻辑上讲,您和我都知道字符串是相同的,但值a
和b
实际上是指向所包含值的指针。因此,当您进行常规比较 ( ==
) 时,它比较的是指针,而不是基础值。由于它们在函数中是不同的值,因此它们被分配到不同的内存地址,因此,a != b
, 但是str_cmp(a, b) == true