c / c ++ проверка совместимости во время компиляции - PullRequest
0 голосов
/ 17 января 2011

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

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

version.h:

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

main.c:

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

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

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

Ответы [ 3 ]

4 голосов
/ 17 января 2011

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

  • main.c:

    #define NEEDED_VERSION 1
    #include "version.h"
    
  • version.h:

    #define CODE_VERSION 2
    #ifndef NEEDED_VERSION
      #error please declare what version you need
    #elif NEEDED_VERSION > CODE_VERSION
      #error
    #endif
    
4 голосов
/ 17 января 2011

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

1 голос
/ 17 января 2011

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

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

main.c:

#include "version.h"
#include <static_assert.h>

static_assert( (CODE_VERSION <= 1), "Incompatible version detected!" )

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...