2011-01-17 5 views
0

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

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

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 

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

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

+1

Я не понимаю, чего вы пытаетесь достичь. Обычно вы меняете версии.h и main.c вместе, чтобы они оставались совместимыми друг с другом. Возможно, вам нужна хорошая система контроля версий? – Juliano

+1

Это а) по сотням файлов, а б) на самом деле НЕ относится к версии - я просто подумал, что это легко доступный эквивалент, без объяснения деталей того, что я на самом деле проверяю. Контроль версий не влияет на проблему. – Nate

ответ

4

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

+0

'#define STATIC_ASSERT (cond) int foo [(cond)? 1: -1] 'для соответствия c –

+0

@Viktor, см. Мой ответ в упомянутом вопросе, это в основном ваш с некоторыми колокольчиками и свистком, что делает его немного более надежным. – AProgrammer

4

Раствор для 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 
    
1

Один из способов т o делать утверждения времени компиляции без использования каких-либо функций C++ 0x, описано в "Compile Time Assertions in C" от Jon Jagger. C Programming wikibook has a section on compile-time assertions.

Вы в конечном итоге с чем-то вроде

main.c:

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

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

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

Смежные вопросы