Глобальный сервис регистрации и оператор запятой

Существует глобальная функция, которая регистрирует сервисы:

// services call this to register upon creation
extern void RegisterService(adapter::Service *s);

Затем где-то в файле .cpp регистрируется какой-то сервис:

// create the adapter and register with libecap to reach the host application
static const bool Registered = (libecap::RegisterService(new Adapter::Service), true);

Почему регистрация не производится просто путем вызова libecap :: RegisterService (новый Adapter :: Service)?
Это выглядит еще более странно, потому что глобальная переменная зарегистрированный не используется

-1

Решение

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

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

3

Другие решения

Атеор кода хотел иметь флаг bool, который сообщит, была ли служба уже зарегистрирована. Он мог написать например

libecap::RegisterService(new Adapter::Service);
static const bool Registered =  true;

при условии, что Registered является локальной переменной.

Но если Registered не является локальной переменной, он может не вызывать функцию вне какой-либо другой функции (или основной функции). Таким образом, единственный способ определить глобальную переменную bool (с внешней или внутренней связью) и одновременно вызвать функцию с возвращаемым типом void — это следующий

static const bool Registered = (libecap::RegisterService(new Adapter::Service), true);

Результат выражения оператора запятой имеет значение true, и Registered будет инициализироваться этим значением. И в то же время будет вызвана функция libecap :: RegisterService (новый Adapter :: Service).

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

3

По вопросам рекламы [email protected]