If the visibility of PredSpec is not declared, it is set to local.
If necessary, an underscore is prepended to CName to get its form as used by the C compiler.
An alternative to this predicate is to use the ec_external() function from the C/C++ interface to perform this operation, e.g. in an initialization or constructor function.
Assume we have the C++ file eg_cc_external.cc: #include "eclipseclass.h" extern "C" int p_sumlist() { int res; long x, sum = 0; EC_word list(EC_arg(1)); EC_word car,cdr; for ( ; list.is_list(car,cdr) == EC_succeed; list = cdr) { res = car.is_long(&x); if (res != EC_succeed) return res; sum += x; } res = list.is_nil(); if (res != EC_succeed) return res; return unify(EC_arg(2), EC_word(sum)); } Compile that into a dynamic library, e.g. using g++ on a Linux machine: g++ -I/usr/local/eclipse/include/i386_linux -shared \ -o eg_cc_external.so eg_cc_external.cc Load the .so file dynamically into Eclipse and declare the external: ?- load('eg_cc_external.so'). yes. ?- external(sumlist/2, p_sumlist). yes. ?- sumlist([1,2,3,4,5],S). S = 15 yes. Errors: external(PredSpec, "p_member"). (Error 4). external(p/0, S). (Error 4). external('p/0', p_p0). (Error 5). external(p/0, 123). (Error 5). external(prmsg/1, nosuchfunc). (Error 211). ?- [user]. p :- a. user compiled 32 bytes in 0.00 seconds yes. ?- external(a/0, c_a). (Error 62).