[q-lang-users] Re: modules in c++
Brought to you by:
agraef
From: Brian W. <drc...@gm...> - 2005-08-26 23:19:48
|
Hello again, (I should probably always just wait to email the list until I've done the "next" bit of research...) Here's what I've figured out: 1) The quoted errors can be "fixed" with the following patch to libq.h: ----------------- patch.libq.h ---------------------- *** libq.1.6.h=09Wed Oct 20 01:09:42 2004 --- libq.h=09Fri Aug 26 15:38:04 2005 *************** *** 127,135 **** --- 127,141 ---- =20 /* Predefined function and type symbols. */ =20 + #ifdef __cplusplus + __DLLIMPORT int truesym, falsesym, nilsym, voidsym; + __DLLIMPORT int inttype, floattype, booltype, strtype, filetype, + listtype, tupletype; + #else __DLLIMPORT const int truesym, falsesym, nilsym, voidsym; __DLLIMPORT const int inttype, floattype, booltype, strtype, filetype, listtype, tupletype; + #endif =20 /* Expression construction. */ ---------------------------------------------------- The upshot is that _DLLIMPORT const... is not a happy thing in C++. BUT, not knowing what the heck I'm doing, I don't know what else I've broken. Someone should correct this change before anyone uses it. 2) Also, the cpp source file needs to be changed to protect the exports from name-mangling by enclosing everything in extern "C" {}. The bar.cpp example becomes: ------------------- bar.cpp -------------------- #include <libq.h> extern "C" { MODULE(bar) typedef struct { long i, j; } Bar; FUNCTION(bar,bar,argc,argv) { long i, j; if (argc !=3D 2 || !isint(argv[0], &i) || !isint(argv[1], &j)) return __FAIL; else { Bar *v =3D (Bar *)malloc(sizeof(Bar)); expr x; if (!v) return __ERROR; v->i =3D i; v->j =3D j; return mkobj(type(Bar), v); } } FUNCTION(bar,dump,argc,argv) { long i, j; Bar *v; if (argc !=3D 1 || !isobj(argv[0], type(Bar), (void **)&v)) return __FAIL; else { printf( "i =3D %d, j =3D %d\n", v->i, v->j); return mkint( 0); } } } ------------------------------------------------- Just for completeness, here's the .q file that goes with this: -------------------- bar.q -------------------- // Type Bar public extern type Bar; public extern bar I J; // I, J: integer public extern dump A; // A: Bar test =3D dump (bar 5 3) || =09dump (bar 1000 25); ------------------------------------------------ Lemme know what you think. Brian |