Нужно ли указывать extern "C" при экспорте символов? - PullRequest
3 голосов
/ 27 марта 2011

Мне интересно, является ли внешний "С" обязательным или нет?

Ответы [ 3 ]

8 голосов
/ 27 марта 2011

Только если вы хотите вызвать свой код из C (или другого компилятора C ++, который вы должны рассматривать как C).

Это отключить name-mangling .

См. Эту статью в C ++ FAQ: http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

1 голос
/ 27 марта 2011

Использование extern "C" отключает искажение имени. Если вы этого не сделаете, клиенту вашей DLL может быть сложно импортировать ваши символы.

Помните, что разные компиляторы C ++ имеют разные правила искажения имен, и поэтому ваши искаженные экспортированные имена могут отличаться от имен, используемых при импорте.

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

Так что, если вы экспортируете классы (обычно плохая идея в любом случае), вам будет легче оставить искажения включенными. В противном случае выключите его с помощью extern "C".

1 голос
/ 27 марта 2011

Нет, вы используете extern "C", чтобы обеспечить C-связь с вашими функциями C ++, чтобы они не были «декорированы», как обычные функции C ++, и чтобы они могли быть вызваны из C (или Objective-C).

Декорирование функции используется для реализации функции C ++ , перегружающей , и присваивает каждому варианту функции различную подпись, позволяя разработчику использовать присвоенное ему имя.

Ваши функции C ++ будут экспортироваться автоматически, просто не используя ключевое слово static. Однако, если вы реализовали свои функции C ++ в Windows DLL, необходимо использовать ключевые слова declspec dllexport/dllimport для внешнего доступа к ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...