Jonas Maebe wrote:

Is this just a mess or do I miss the true logic behind it ?

If you declare an external function/procedure as "cdecl", the compiler with /always/ add the necessary C-prefix (if any) to the external name.

I see, so if I add

{$ifdef FPC}
{$calling cdecl}
{$endif

and skip the underscore, this results in multi-platform and gpc compatible 'external name xxx" directives.

The universal interfaces are declared as mwpascal rather than cdecl, and such functions/procedures do not automatically get the C-prefix (although one might argue that it would have been better if they did, and indeed if FPC on all platforms by default prefixed all its symbol names with the same prefix as the main C compiler(s), but the fact is that it doesn't do so today -- but maybe this could be changed now that there still aren't many FPC shared libraries in common use).

Yes.

To make matters even more interesting (in the Chinese sense), there are also {$mode macpas} interface-only units (i.e., units without an implementation section, like many of the universal interfaces). Because this support was added solely for the purpose of supporting (older versions of) the universal interfaces, in that case any function without an explicitly specified external name also gets the C-prefix added (which does not apply to the universal interfaces units, since all functions/procedures there do have an explicitly specified external name).

Are you saying that adding IMPLEMENTATION BEGIN changes the meaning of the INTERFACE section. That is hardly a defendable compiler feature, is it ?

Regards,

Adriaan van Os
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to