in reply to Re^2: Name conflict between MinGW C++ standard library header and Perl development header
in thread Name conflict between MinGW C++ standard library header and Perl development header

Why there's such big difference? I cannot understand it...

(Yeah ... sorry, not much point running Inline::C scripts when we're dealing with something that's specific to Inline::CPP ;-)

I don't grok C++, and I can only assume that in your simplified Inline::CPP script, the write() call in ostream has not been made visible. It's definite that 'write' has been defined to 'PerlLIO_write' - just try to use write() in your Inline::CPP script and you'll be able to verify:
use strict; use Inline 'CPP' => config => BUILD_NOISY => 1; foobar(); use Inline 'CPP' => <<'CODE'; #include <perl.h> // not needed - gets included automatically #include <iostream> void foobar() { std::cout << "foobar" << std::endl; } void break_me(SV * a, SV * b) { write(a, b); } CODE
That generates the error:
try_pl_dec5.xs:28:14: error: macro "PerlLIO_write" requires 3 argument +s, but only 2 given write(a, b);
In ostream, the write() declaration is preceded (next line up) by __ostream_type&. I don't know whether that puts aome sort of condition upon whether the function is visible or not.
Maybe if you include the same headers in the compilation of your Inline::CPP script as were used for the C++ script then things might start to add up correctly.

I know it's messy ... XS is like that, but you just have to work through it.

Cheers,
Rob
  • Comment on Re^3: Name conflict between MinGW C++ standard library header and Perl development header
  • Select or Download Code

Replies are listed 'Best First'.
Re^4: Name conflict between MinGW C++ standard library header and Perl development header
by llancet (Friar) on Nov 13, 2014 at 09:48 UTC

    __ostream_type& is the return type of write() function. Nothing important.

    In C++, "&" is reference. You can just treat it as a sugar for pointers.