Nano Hash - криптовалюты, майнинг, программирование

c/c++ проверка совместимости во время компиляции

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

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

версия.ч:

#define CODE_VERSION 2
#define VERSION(x)    #if (CODE_VERSION > (x) ) \
                          #error "Incompatible version detected!" \
                      #endif

основной.с:

#include "version.h"
VERSION(1)
// ...and so on

Если выходные данные препроцессора возвращались в препроцессор, это должно было вызвать ошибку во время компиляции.

Итак, каков правильный способ добиться такого (или подобного) поведения? Для любопытных, идея заключается в том, чтобы избежать ручного анализа во время проверки достаточно большой кодовой базы, чтобы соответствовать процессу аудита (поскольку автоматический аудит гораздо менее обременительный).

17.01.2011

  • Я не понимаю, чего вы пытаетесь достичь. Обычно вы меняете версии.h и main.c вместе, чтобы они оставались совместимыми друг с другом. Возможно, вам нужна хорошая система контроля версий? 17.01.2011
  • Это а) для сотен файлов и б) на самом деле НЕ связано с версией - я просто подумал, что это был легкодоступный эквивалент, без необходимости объяснять детали того, что я на самом деле проверяю. Контроль версий не имеет отношения к проблеме. 17.01.2011

Ответы:


1

повысить статическое утверждение? Поскольку это помечено C и C++, повышение, возможно, не вариант, но обратитесь к: BOOST_STATIC_ASSERT без повышения для альтернативы.

17.01.2011
  • #define STATIC_ASSERT(cond) int foo[(cond) ? 1 : -1] для c соответствия 17.01.2011
  • @Viktor, смотрите мой ответ в упомянутом вопросе, он в основном ваш, с некоторыми прибамбасами, делающими его немного более надежным. 17.01.2011

  • 2

    Решение, доступное для C, может состоять в том, чтобы определить в вашем main.c нужную версию, прежде чем включать version.h:

    • основной.с:

      #define NEEDED_VERSION 1
      #include "version.h"
      
    • версия.ч:

      #define CODE_VERSION 2
      #ifndef NEEDED_VERSION
        #error please declare what version you need
      #elif NEEDED_VERSION > CODE_VERSION
        #error
      #endif
      
    17.01.2011

    3

    Один из способов создания утверждений времени компиляции без использования каких-либо функций C++0x описан в "Утверждения времени компиляции". in C" Джона Джаггера. В Викикниге по программированию на C есть раздел, посвященный утверждениям во время компиляции.

    Вы получите что-то вроде

    основной.с:

    #include "version.h"
    #include <static_assert.h>
    
    static_assert( (CODE_VERSION <= 1), "Incompatible version detected!" )
    

    p.s.: я почти уверен, что «использовать разработку через тестирование (TDD) и достойную систему контроля версий» — лучший способ избежать случайного включения старых версий исходного кода.

    17.01.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..