C++ 如何检查C/C++;一致的#定义和#x27;什么用法?

C++ 如何检查C/C++;一致的#定义和#x27;什么用法?,c++,c,c-preprocessor,static-analysis,C++,C,C Preprocessor,Static Analysis,我正在一个大型的、古老的但积极开发的C/C++代码库上工作,在这里使用#define来控制代码的编译时方面是一种常见的做法。例如,通常在生成文件中定义-DTARGET\u HAS\u FEATURE,然后在代码中使用它: #ifdef TARGET_HAS_FEATURE // ... conditionally included code #endif 该项目是多目标和跨平台的,因此可以理解,通过智能使用预处理器,某些怪癖更容易处理。然而,我有一种强烈的感觉,在现阶段,这样的宏观定义被过度使

我正在一个大型的、古老的但积极开发的C/C++代码库上工作,在这里使用
#define
来控制代码的编译时方面是一种常见的做法。例如,通常在生成文件中定义
-DTARGET\u HAS\u FEATURE
,然后在代码中使用它:

#ifdef TARGET_HAS_FEATURE
// ... conditionally included code
#endif
该项目是多目标和跨平台的,因此可以理解,通过智能使用预处理器,某些怪癖更容易处理。然而,我有一种强烈的感觉,在现阶段,这样的宏观定义被过度使用,我想控制它们。它们本质上被视为全局非类型化变量,可以方便地由一些开发人员使用。不用说,这会使理解代码的实际功能变得非常复杂,有时还会隐藏bug

这里的问题是:是否有任何方法来分析预处理器在项目范围内运行的环境,并在某些属性不成立时报告?答案可能本质上是为预处理器语言设计的静态代码分析器工具,但它可以是现有预处理器软件的标志、代码样式指南或任何其他旨在解决现有代码库中宏语言的已知弱属性的技术

我想检查的属性包括:

  • 是否存在从未在代码中的单个位置使用的声明定义(未使用的变量)
  • 是否存在引用任何文件中从未定义的名称(未定义的变量)的
    #ifdef
    -
    #endif
  • def/undef和算术表达式中是否使用相同的宏定义(类型冲突)
  • 是否重新定义宏定义(更改常量变量)
  • 嵌套表达式的级别是否太大(代码可读性问题)

  • 在以前的工作场所中,我们实现了这类功能,但它使用了一个简单的预处理器步骤作为项目“引导”代码的一部分,该代码获取了一个配置文件,列出了所有可用的功能切换及其状态,然后生成了一个标准化的头。这样做的好处是可以集中管理功能,并且不可能使用没有定义的功能,因为编码标准要求使用
    \if
    而不是
    \ifdef
    。这听起来是一个非常有趣的工具,这样的分析器!也非常复杂,因为一些符号可能只有在其他符号以正确的方式使用时才会使用,在一些
    #if
    s的深处。你不能用一个好的静态代码分析软件来做到这一点吗?你还需要解析
    Makefile
    来定义可能的集合列表…检查我问题中提到的工具