Библиотека флагов компиляции

Андрей Руссков
Андрей Руссков

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

 

Предлагаю решение: простой модуль, в котором будет собран набор constexpr переменных/consteval функций, зависящих от всего этого внешнего безобразия и не транслирующий никакие из этих макросов наружу. По сути, упростит написание переносимых библиотек, в т.ч. и стандартной

enum class build_type_t {
    release,
    debug,
    profile,
    // ...
};

constexpr auto build_type = build_type_t::release/**/;

constexpr string_view toolchain_name = "gcc"/**/;

struct toolchain_version_t {
    size_t major;
    size_t minor;
    size_t bugfix;
    // ...
};

constexpr toolchain_version_t toolchain_version { 9, 3, 1 /**/ };

consteval bool supports_standard(string_view revision) {
    constexpr unordered_set<string_view> revisions = {
        "c++98",
        "c++03",
        "c++0x",
        "c++11",
        "c++0y",
        "c++14",
        "c++20",
        // ...
    };

    // Рано или поздно constexpr контейнеры всё равно заедут,
    // как и contains, но можно написать через if constexpr
    return revisions.contains(revision);
}

consteval bool supports_feature(string_view feature) {
    constexpr unordered_set<string_view> features = {
        "concepts",
        "contracts",
        // ...
    };
    return features.contains(feature);
}

consteval bool supports_architecture(/*...*/) { ...

ну и так далее по аналогии.

7
рейтинг
Нет комментариев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения