Польза от использования extern?

204
15 марта 2017, 19:35

Можно ли извлечь какую-нибудь пользу от использования extern в с++? Допустим, например, что программа не использует глобальные переменные. Первая мысль что приходит на ум, так это попытаться использовать extern для использования функций, не объявляя при этом их в заголовке (вероятно это увеличит скорость компиляции - но ведь и может замедлить например скорость линковки). В общем немного не понятно, может это просто рудимент от с, и в с++ не имеет большого смысла.

Answer 1

Этот вопрос в общем-то отвечен в документации и на форуме http://www.cplusplus.com/forum/general/21368/

Во-первых. понятие "польза" здесь неприменимо. Ключевое слово extern выполняет функции, иначе не достижимые другими средствами. Извините, но в языке редко остается что-то лишнее просто так (ключевое слово register - очень особый случай)

Ключевое слово extern используется в трех случаях

  1. Для описания статического хранилища со спецификатором внешнего связывания.

  2. Для указания языка, "С" или "С++". Это влияет на то, происходит ли искажение имен для С++ или нет). Следует учитывать, что это не предполагает что код компилируется "как в Си".

  3. Декларация явной инстанциации шаблона типа (extern template).До С++11 это было только расширением языка (оригинально - компиляторов IBM), при использовании некоторых компиляторов extern не требовался. Его разрешено использовать только один раз для данного списка аргументов.

    extern template сlass-name < argument-list >;

An explicit instantiation declaration (an extern template) skips implicit instantiation step: the code that would otherwise cause an implicit instantiation instead uses the explicit instantiation definition provided elsewhere (resulting in link errors if no such instantiation exists). This can be used to reduce compilation times by explicitly declaring a template instantiation in all but one of the source files using it, and explicitly defining it in the remaining file (С++11).

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

Answer 2

Чаще всего extern используется для неявного совместного доступа к общим данным из разных модулей программы. Часто применяется при работе плохо спроектированными библиотеками. Проще создать глобальную переменную и подцепить ее через extern, чем писать несколько акцессоров.

Единственным его преимуществом является только то, что на обмен данными не тратится дополнительное время, так как данные всегда под рукой у каждого модуля, и не требуется никакой синхронизации (только в однопоточном режиме). В современных реалиях оправдать использование extern можно только в ПО для микроконтроллеров, и только в исключительных ситуациях, когда быстродействие действительно важно.

Его использование может сильно запутать стуктуру программы и привести к спагетти коду. Лучше придерживаться такого правила: если можно обойтись без extern, то нужно без него обойтись.

READ ALSO
Вывод измененного массива

Вывод измененного массива

Есть задача,найти в массиве максимальный и минимальный елемент, и поменять местамиЯ нашел такой пример, но не знаю как вывести измененный...

210
Сгруппировать массив - C++

Сгруппировать массив - C++

Всем привет,есть такое заданиеОно у меня проходит 0%

325
Qt делегаты и условное форматирование

Qt делегаты и условное форматирование

Нужно создать делегат для столбца в таблице, который меняет цвет фона в ячейке по цветовой шкале от самого большого значения (тёмно-зелёный)...

317
Численные методы (метод хорд)

Численные методы (метод хорд)

Было задание найти корни уравнения методом хордКод выглядит следующим образом:

279