Skip to main content


I'm using h2xs to make glue code for a C library to a module. Imagine this scenario in the C header:

struct foo; struct foo * new_foo(); void set_foo_member(struct foo * f, int value); int get_foo_member(const struct foo * f); 

When I run h2xs -x on this I get something like this in the .xs file:
struct foo * new_foo() int get_foo_member(f) const struct foo * f void set_foo_member(f, value) struct foo * f int value 

and in the typemap:
const struct foo * T_PTROBJ struct foo * T_PTROBJ 

This builds fine, however, when I go to actually use the code like this:
my $foo = new_foo(); $foo->set_foo_member(123); print "Foo member is: " . $foo->get_foo_member(); 

I get an error like the following:
get_foo_member: Expected f to be of type const struct FooPtr; got struct FooPtr=SCALAR(0x2ecd9c2dd768) instead at ... 

Right, so, that's the backstory. XS checks the type of incoming objects and makes sure they match the expected type from the C header, and if they differ, it throws an error. But it seems to be considering struct foo * and const struct foo * to be two different types, even though they're not (really). Perl shouldn't care about this at all.

What's the solution here? Do I remove all const keywords in my XS code? Is there some switch or setting to make xsubpp treat both as the same type? Something else?

submitted by /u/greg_kennedy
[link] [comments]