[erlang-bugs] ERL_NIF_TERM type collision

Daniel Goertzen <>
Mon Mar 19 02:07:37 CET 2012

I am working on a c++ nif and have an overloaded function that takes a
number of different types including integers and ERL_NIF_TERMs.  The
problem is that ERL_NIF_TERM really just an integer and collides with my
integer functions, for example:

int get(std::string var) {...}
int get(unsigned long var) {...}
int get(ERL_NIF_TERM var) {...}  //compile error because ERL_NIF_TERM is
really an unsigned long.

It would be great it ERL_NIF_TERM was a unique type so it could be used in
this situation.

My first attempt to solve this involved creating wrappers for each NIF API
function.  The wrapper used a new unique type instead of ERL_NIF_TERM, and
did type casting as needed.  It was a type punning bloodbath.  This was
complex and unsatisfactory.

My second attempt was to hack erl_nif.h to change the definition of
ERL_NIF_TERM to a struct containing an int, and this worked great.  But
this is not very portable due to the custom erl_nif.h.  Also, I don't know
enough about linkers to know for sure if this is permitted.

Has this problem come up before?

Is there some easy alternative that I am missing?

Should I submit a patch for the erl_nif.h hack? (It is conditionally
compiled, by default nothing changes)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20120318/56ec4791/attachment.html>

More information about the erlang-bugs mailing list