On Sunday, 23 August 2015 at 13:09:46 UTC, Benjamin Thaut wrote:

The good news is, once I'm done with my windows DLL work the code can be trivialy reused to make export control the visibility of symbols on linux as well.

Kind Regards
Benjamin Thaut

But then you have the same problem on linux as on windows. "Export" controls not only the symbol visibility across shared library boundaries but also the module level visibility. E.g. this is a problem


private void SomeImplementationDetail() { ... }

void SomeTemplateFunc(T)()
{
  SomeImplementationDetail();
}


If you compile this into a shared library and all symbols are hidden by default unless marked with export it will fail to compile if someone tries to use it. Because the instanciated template SomeTemplateFunc will call the SomeImplementationDetail function which is not visible across the shared library boundary.

To fix this you would have to do:

export void SomeImplementationDetail() { ... }

void SomeTemplateFunc(T)()
{
  SomeImplementationDetail();
}

But this means that users of the shared library would suddenly be allowed to call SomeImplementationDetail.

The fix would be to make export an attribute instead of an protection level resulting in:

private export void SomeImplementationDetail() { ... }

void SomeTemplateFunc(T)()
{
  SomeImplementationDetail();
}


Reply via email to