On attribute inference...
Satoshi via Digitalmars-d
digitalmars-d at puremagic.com
Tue Apr 19 04:19:54 PDT 2016
On Tuesday, 19 April 2016 at 08:57:21 UTC, Jonathan M Davis wrote:
> On Tuesday, April 19, 2016 07:58:19 Satoshi via Digitalmars-d
> wrote:
>> Why cannot be exported every public/protected method by
>> default? When I am creating so/dll I want to export almost
>> everything. Methods what I dont want to export I should mark
>> as private or package or package(nameOfRootPackage).
>
>>From the standpoint of simplicity, that's definitely nicer.
>>With C/C++ and
> Linux, the default is that all symbols in a shared library are
> visible, whereas on Windows, on those which are explicitly
> exported are visible, and I always found having to deal with
> building on a Windows a royal pain - especially when what I had
> done just worked on Linux.
>
> However, there are some good arguments for not just exporting
> everything - particularly with regards to compilation
> efficiency. It's not that uncommon for a library to have a
> public API that everyone should see and use while having a
> bunch of functions that are used only internally and really
> shouldn't be exposed to users of the library. To some extent,
> package can be used to hide those, but the larger the library,
> the harder that gets. And if a library is very deep (i.e. its
> functions do a lot for you), then you're fairly quickly going
> to end up with functionality that ideally would be hidden, and
> putting everything in one module or package isn't always
> reasonable. As it is Phobos has std.internal which is
> theoretically not supposed to be used outside of Phobos, but
> it's completely importable and usable by any code using Phobos.
> Having code like that restricted by export could be desirable.
>
> I expect that hiding symbols which aren't public would
> certainly help a great deal in avoiding having a lot of
> unnecessary symbols in a compiled library, but it doesn't
> completely solve the problem. And when discussions on export
> have come up, some of the folks who are particularly
> knowledgeable on the subject have been _very_ much in favor of
> using export to restrict what is and isn't visible in the
> generated library rather than relying on public. They'll have
> to chime in to provide good details though. The main issue that
> I recall is the desire/need to reduce the number of symbols in
> order to make compiling/linking more efficient.
>
> - Jonathan M Davis
But when I create two versions of the same library (shared and
static one). Public symbols will be accessible through the static
library but inaccessible through the shared library.
Library is a one big package and marking symbols as
package(MyLib) is same as mark them as public in shared object.
e.g. I have MyLib and TestApp
MyLib
- math.d
- foo.d
- bar/test.d
TestApp
- main.d
or subpackages like
rikarin.core;
rikarin.appkit;
rikarin.base;
rikarin.backend;
etc.
I can easily create internal methods through the package(rikarin)
definition. And package symbols shouldn't be exported.
More information about the Digitalmars-d
mailing list