Чем это называют, когда внедрения (группы единичных предметов) саморегистрируются в некоторой регистрации непосредственно от их единицы компиляции в C++?

Предположим, что у нас есть такая схема:

qqqapi.h:

int register_qqq(Qqq* klass);

qqqalpha.cpp:

QqqAlpha::QqqAlpha(...) : Qqq(...) { }

QqqAlpha instance;
int dummy = register_qqq(&instance);

qqqbeta.cpp:

QqqBeta::QqqBeta(...) : Qqq(...) { }

QqqBeta instance;
int dummy = register_qqq(&instance);

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

Как этот образец называют? Есть ли какие-либо рекомендации об осуществлении таких вещей правильно?

1
добавлено отредактировано
Просмотры: 1
de
@DeadMG, Что вы предлагаете вместо этого? Моя единственная другая идея в настоящее время состоит в том, чтобы просматривать, хотя исходный код для внедрений и код - производят файл реестра перед компиляцией. Но это требует больше, строят зависимости и удовлетворение требованиям заказчика файла типа "build"...
добавлено автор Vi., источник
Весело плохой дизайн.
добавлено автор Puppy, источник
Не у каждого соединения встык кода есть имя. Рекомендации: поместите фиктивную переменную в неназванное пространство имен, отметьте ее как константа (и вероятно лучше сделать специальный класс, чтобы сделать это, вместо того, чтобы создать функцию, которая возвращает бессмысленное целое число), и дайте ей уникальное, названное скрытым позади макроса, таким образом, люди не могут случайно коснуться ее. Все это поможет гарантировать, что компоновщик может удалить его из заключительного исполняемого файла и облегчить использовать. Заключительная вещь должна быть похожей на REGISTER_QQQ (случай); . Но это обычно делается, чтобы зарегистрировать типы соединенный с последовательностями (т.е., строительные функции)...
добавлено автор GManNickG, источник
... не случаи. Случаи должны зарегистрироваться если that' s часть их контракта на строительство. Независимо, этот isn' t хороший вопрос для ПОЭТОМУ с тех пор there' s никакая авторитетная директива к тому, как это должно быть сделано.
добавлено автор GManNickG, источник
Избиратели @close: "Как этот образец называют?" конкретный простой вопрос. Аналогично "Там любые рекомендации", да там. You' ре, голосующее, чтобы закрыть на основе невежество , и это не хорошая основа. Это doesn' t означают это you' ре, квалифицированное, чтобы голосовать. Это означает противоположное.
добавлено автор Cheers and hth. - Alf, источник
@Vi.: Я понятия не имею, каков был бы хороший дизайн (и никакое терпение посмотреть на ваш вопрос), но я как раз сегодня прокомментировал это по другому вопросу о единичном предмете. Надежда, которая помогает.
добавлено автор sbi, источник

1 ответы

Основная проблема с этой схемой состоит в том, что внедрение C++ имеет дело с целым единицы перевода .

Рассмотрите статическую библиотеку, которая включает сотни единиц перевода. До компилятора и компоновщика знает, ваша программа только использует один или два. Мало они знают, что посредством авторегистрации в объекте регистрации, ваша программа на самом деле использует пять единиц!

Так, компоновщик удаляет все единицы перевода, которые библиотека обеспечивает, кроме одной или два, которые являются непосредственно </ими> используемый вашим кодом, например, вызывая функции или относясь к переменным.

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

Это - возможно причина, почему pattern/idiom/whatchammacallit мало используется. Это хорошо работает для файлов объектного кода, потому что тогда вы явно говорите компоновщику, что включать. Это работает менее прекрасное на статические библиотеки.


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

Это гарантирует, что есть , видимые зависимость, так, чтобы единица перевода не была удалена.


Я не знаю обычно используемого названия этого. В былые времена, с другим языком, было что-то названное конверт модуля , о котором можно думать как казнь конструктора и деструктор статического объекта, ответственного за инициализацию и очистку модуля. Но C++ не поддерживает это, и как я вспоминаю, googling термин в последние годы не обеспечил соответствующих хитов; это похоже на всю информацию об этом, исчез...

1
добавлено
@Cheersandhth.-Alf: Был бы единица перевода действительно позволила быть "оптимизированной далеко" даже в присутствии побочных эффектов, видимых вне той единицы перевода (как в этом примере)? - Ваше предложение о явном обращении к единице перевода doesn' t выравнивают с требованиями OPs.
добавлено автор krlmlr, источник
@Cheersandhth.-Alf: Огромное спасибо за просвещение меня.
добавлено автор krlmlr, источник
Есть ли какие-либо Определенные для QT помощники для этого, возможно?
добавлено автор Vi., источник
BTW я должен назвать вещь "Регистрацией Единичного предмета"? Или это не подразумевает такую саморегистрацию?..
добавлено автор Vi., источник
Имя собаки не имеет значения так, пока собака отвечает на него, и другие знают о который собака you' разговор ре.
добавлено автор Cheers and hth. - Alf, источник
@user946850: да, когда от перевода отказываются от набора включенных единиц перевода, от этого "действительно" отказываются. и да компиляторы делают это. that' s, почему я написал, что это происходит. u теперь, потому что это делает. относительно "предложения", it' s довольно вводящий в заблуждение из вас (кто, чтобы завершить его, анонимное в Интернете, возможно собака) назвать его этим. логическое требование не предложение. это - логическое требование. вы могли бы также говорить о предположении, что Земля вращается вокруг Солнца. эти отношения не предложение. это - факт. вы понимаете это?
добавлено автор Cheers and hth. - Alf, источник