| <html> |
| <head> |
| <title>SWIG:Examples:go:funcptr</title> |
| </head> |
| |
| <body bgcolor="#ffffff"> |
| |
| |
| <tt>SWIG/Examples/go/funcptr/</tt> |
| <hr> |
| |
| <H2>Pointers to Functions</H2> |
| |
| <p> |
| Okay, just what in the heck does SWIG do with a declaration like this? |
| |
| <blockquote> |
| <pre> |
| int do_op(int a, int b, int (*op)(int, int)); |
| </pre> |
| </blockquote> |
| |
| Well, it creates a wrapper as usual. Of course, that does raise some |
| questions about the third argument (the pointer to a function). |
| |
| <p> |
| In this case, SWIG will wrap the function pointer as it does for all |
| other pointers. However, in order to actually call this function from |
| a Go program, you will need to pass some kind of C function pointer |
| object. In C, this is easy, you just supply a function name as an |
| argument like this: |
| |
| <blockquote> |
| <pre> |
| /* Some callback function */ |
| int add(int a, int b) { |
| return a+b; |
| } |
| ... |
| int r = do_op(x,y,add); |
| </pre> |
| </blockquote> |
| |
| To make this work with SWIG, you will need to do a little extra work. |
| Specifically, you need to create some function pointer objects using |
| the %constant directive like this: |
| |
| <blockquote> |
| <pre> |
| %constant(int (*)(int,int)) ADD = add; |
| </pre> |
| </blockquote> |
| |
| Now, in a Go program, you would do this: |
| |
| <blockquote> |
| <pre> |
| int r = do_op(x,y, example.ADD) |
| </pre> |
| </blockquote> |
| where <tt>example</tt> is the module name. |
| |
| <h2>An Example</h2> |
| |
| Here are some files that illustrate this with a simple example: |
| |
| <ul> |
| <li><a href="example.c">example.c</a> |
| <li><a href="example.h">example.h</a> |
| <li><a href="example.i">example.i</a> (SWIG interface) |
| <li><a href="runme.go">runme.go</a> (Sample program) |
| </ul> |
| |
| <h2>Notes</h2> |
| |
| <ul> |
| <li>The value of a function pointer must correspond to a function |
| written in C or C++. It is not possible to pass an arbitrary Go |
| function in as a substitute for a C function pointer. |
| |
| </ul> |
| |
| <hr> |
| </body> |
| </html> |
| |
| |
| |
| |