Правильно ли экспортировать данные членов? (C ++) - PullRequest
0 голосов
/ 21 октября 2008

Как следует из заголовка, является ли правильным или допустимым импорт / экспорт статических данных из класса C ++?

Я обнаружил свою проблему - автор класса, на который я смотрел, пытался экспортировать записываемые статические данные, которые не поддерживаются на этой платформе.

Большое спасибо за ответы, однако.

Ответы [ 3 ]

2 голосов
/ 21 октября 2008

Экспортированный класс C ++ означает, что клиенты DLL должны использовать тот же компилятор, что и DLL, из-за искажения имени и других проблем. На самом деле это довольно большая проблема, мне когда-то приходилось писать обертки C для нескольких классов C ++, потому что клиентские программы переключились на MSVC9, а сама DLL использовала MSVC71. [Были некоторые другие сложности с переключением DLL на MSVC90]. С тех пор я довольно скептически относился к этому бизнесу экспорта классов и предпочел написать обертку C для всего.

Теперь, если вы готовы заплатить цену за экспорт классов, я бы сказал, что экспорт статических данных не усугубляет проблему. Возможно, среди видов вещей, которые вы можете экспортировать, безопаснее всего экспортировать статические константы. Тем не менее, я бы предпочел не делать этого, потому что, как говорит Тимо, вы теперь заперты в этой реализации.

Одна из платформ, над которой я работал, требовала, чтобы ее клиенты предоставляли набор констант кода ошибки. Со временем мы обнаружили, что использование простой группы констант было слишком хрупким, и мы переключились на ОО-дизайн. У нас была реализация по умолчанию, которая возвращала бы общие коды ошибок, но к каждому из кодов ошибок обращались с помощью виртуальной функции, которая могла быть переопределена отдельными клиентами - и они использовали ее из некоторой расширенной обработки ошибок, специфичных для устройства. Это решение оказалось гораздо более масштабируемым, чем решение, основанное на экспорте констант.

Я бы посоветовал вам долго и усердно думать о том, как вы ожидаете развития компонента, прежде чем экспортировать статические переменные.

1 голос
/ 21 октября 2008

Правильно ли это, поскольку оно будет работать и делать то, что вы ожидаете? Предполагая, что вы говорите об использовании _declspec (dllexport / dllimport) для класса или члена класса, да, вы можете сделать это, и это должно дать вам ожидаемый результат - статические данные будут доступны вне вашей dll, а другой код C ++ может получить при условии, что спецификация доступа C ++ (публичная / защищенная / приватная) не будет блокировать внешний доступ.

Это хорошая идея? Лично я так не думаю, так как вы будете подвергать внутренности классов не только своей библиотеке, но и внешнему миру, а это значит, что практически невозможно изменить детали реализации в конце дня. Спросите себя, уверены ли вы на 100%, что интерфейс этого класса и большая часть его реализации никогда не изменятся ...

0 голосов
/ 22 октября 2008

dllexport (или импорт) на элементе данных класса (не статический) ничего не делает. Экспортируемые «вещи» - это либо функции, либо глобальные данные (хотя это сомнительный выбор дизайна). dllexport для класса - это просто сокращение, чтобы сказать «экспортировать все эти функции».

...