2

どして

int enif_compare(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs)

だけでなく使用する必要があります

if( lhs == rhs ) return 1;

原子を比較していることが重要だと思います。

4

1 に答える 1

4

ERL_NIF_TERMは不透明(OPAQUE)型であり、私の知る限り、値というよりもポインターに似ています。実際、定義は次のとおりですtypedef unsigned long ERL_NIF_TERM(技術的にはいくつかのバリエーションがありますが、それらはすべてシステム上のメモリアドレスと同じサイズの整数です)

したがって、C文字列を比較するときに使用する必要があるのと同じ理由でenif_compareを使用する必要がありますstr_cmp。参照される値は同一である可能性がありますが、取得する値はそれを表すものではありません。

検討:

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 に答える