Предположим, что в случае, когда центральному «контроллеру» нужны разные клиенты, использующие единый интерфейс. Каждый клиент реализован в отдельном .cpp файле (модуле). Функциональность каждого клиента неизвестна контроллеру.
Существует известная хитрость, чтобы каждый модуль автоматически регистрировал своего клиента:
MyClient1.cpp
#include "client_inter"
class MyClient1 : public IClient
{ ... }
static MyClient1 client;
static int regStatus = register_client(&client);
Функция register_client реализована где-то внутри «контроллера». Он автоматически вызывается глобальным инициализатором, и поэтому модуль вводит своих клиентов в контроллер, не будучи непосредственно известным контроллеру.
Все это прекрасно работало до недавнего времени, когда в нашу инфраструктуру сборки GCC был добавлен ключ -nostartfiles . Теперь глобальный инициализатор не работает, и поэтому 'register_client' не вызывается, и клиент не зарегистрирован в контроллере.
Пока я пытаюсь удалить этот переключатель из сборки, мне может понадобиться альтернативный способ (даже специфичный для GCC), чтобы иметь те же функции.
Проблема в том, что существует много клиентов, и они не всегда присутствуют в сборке (это зависит от цели и конфигурации). Поэтому я не хочу, чтобы контроллер знал их все. Или пусть он «знает» их всех, но пропущенные символы не нарушат связывание.