и вы используете GCC (и только его, как я понял, ничего для кейла и прочих друзей я пока не узрел). А GCC прекрасно умеет в #pragma once. Так вот вопрос, почему вы выбрали вариант с #ifndef abracadabra?когда-то просто где-то увидел, что делают так. Думал, иначе нельзя. Сейчас посмотрел, действительно очень удобно. Везде обновлю это. Спасибо.
typedef typename T cfg_type;. Но не суть. Сам подход уловил.
constexpr const pll_cfg* rcc::pll_main_configuration_check ( const pll_cfg* const cfg, uint8_t count ) {
// Проверяем все имеющиеся структуры конфигурации основного PLL.
for ( int loop = 0; loop < count; loop++ ) {
// Ошибка в одной из структур pll_cfg, параметр M.
static_assert(( cfg[loop].m < 2 ) || ( cfg[loop].m > 63 ), "Structure has an invalid parameter M! M >= 2 and M <= 63!");
error: non-constant condition for static assertion
// Ошибка в одной из структур pll_cfg, параметр M.
if ( ( cfg[loop].m < 2 ) || ( cfg[loop].m > 63 ) )
static_assert(false, "Structure has an invalid parameter M! M >= 2 and M <= 63!");
1. Предполагаем, что пользователь ВСЕГДА ВВОДИТ ВЕРНЫЕ ЗНАЧЕНИЯ! В таком режиме код по ссылке вполне удачен. А далее делаем следующее.
2. pin_config_t, объявлена так:
Мы добавляем вот такую оболочку!
Условие набросал от балды. Тут может быть что угодно. Любая проверка параметров шаблона. Этим мы сможем гарантировать, что пользователь не делал чего-то типа (EC_PIN_MODE)(1221) и подобного.
А в коде пользователя объявляем так:
Если нужен массив, то потом так:
Причем прошу заметить! Я создаю массив просто структур pin_config_t (обычные упакованные структуры из языка C (не CPP)). А внутрь помещаю созданную шаблоном. Причем они выглядят как абсолютно равнозначные.
В сам объект я могу толкнуть при инициализации как указатель на массив упакованных структур, так и на созданные шаблоном экземпляр "структуры".
Конструктор объекта объявлен так:
Интересно вот только, почему это работает.