В целевых ELF, если у меня есть class Foo
, и я дал ему видимость default
с помощью объявления типа class __attribute__((visibiility("default"))) Foo
, тогда я могу выборочно освободить некоторых членов класса от видимости default
, явно аннотируя их с __attribute__((visibility("hidden"))
. Это может быть полезно для встроенных методов, которые не должны составлять часть ABI, поэтому, если они генерируются при создании библиотеки, определяющей class Foo
, они не экспортируются или для private
членов или типов внутри class Foo
, которые должны также не являются частью его ABI.
Однако, в Windows, похоже, нет средств для достижения этого. В то время как неприкрашенный class Foo
автоматически является приватным для DLL, однажды украшенный как class __declspec(dllexport) Foo
, весь класс теперь dllexport
, и, похоже, нет связанной аннотации, которая может выборочно переопределять статус __dllexport
определенного члена, Маркировка элементов "не для экспорта" как __declspec(dllimport)
явно неверна.
Есть ли другой способ предотвратить использование класса __dllexport
для определенных членов класса и/или типов?
Чтобы сделать это более конкретным, что я хотел бы сказать и могу сказать, при использовании аннотаций ELF:
class __attribute__((visibility("default"))) Foo {
public:
Foo(); // OK, default visibility
// Don't let inlines join the ABI
__attribute__((visibility("hidden")) inline void something() { ... }
private:
// Don't let private members join the ABI
__attribute__((visibility("hidden")) void _internal();
// Our pImpl type is also not part of the ABI.
struct __attribute__((visibility("hidden")) pimpl;
};
Но я не могу создать одно и то же, используя атрибуты MSVC:
class __declspec(dllexport) Foo {
public:
Foo(); // OK, dllexport'ed
// Don't let inlines join the ABI, but how to say it?
__declspec(???) inline void something() { ... }
private:
// Don't let private members join the ABI, but how?
__declspec(???) void _internal();
// Our pImpl type is also not part of the ABI, but how?
struct __declspec(???) pimpl;
};
В реализации реального мира я ожидаю, что разница между ними будет скрыта за макросом.
Есть ли какой-то __declspec
, который я пропускаю, который имеет семантику __attribute__((visibility("hidden")))
и может переопределить приложение scope класса __declspec(dllexport)
?