c / c ++编译时“兼容性”检查

时间:2011-01-17 15:38:22

标签: c++ c macros

首先,我认识到这可能是不可能的,因为宏只扩展了一次。但是,我希望有一些获得类似行为的标准方法,或者其他方法的建议。

我正在寻找一种方法来对我们的构建执行编译时检查,这会在不兼容的情况下引发错误。当然,以下内容不起作用,但这是我想到的最简单的方法:

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 个答案:

答案 0 :(得分:4)

提升静态断言?由于这是标记为C和C ++,因此可能不是一个选项,但可以参考:BOOST_STATIC_ASSERT without boost替代。

答案 1 :(得分: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
    

答案 2 :(得分:1)

在不使用任何C ++ 0x功能的情况下进行编译时断言的一种方法如下所述 Jon Jagger "Compile Time Assertions in C"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!" )

P.S .: 我几乎可以肯定“使用测试驱动开发(TDD)和一个不错的版本控制系统”是避免意外包含旧版源代码的更好方法。