Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 代码复杂性度量和ifdef_C++_C_C Preprocessor - Fatal编程技术网

C++ 代码复杂性度量和ifdef

C++ 代码复杂性度量和ifdef,c++,c,c-preprocessor,C++,C,C Preprocessor,我想知道在面对C/C++代码中的ifdef时如何计算标准代码复杂性度量(例如,LOC、McCabe圈复杂度、Halstead度量等) 如果忽略ifdef,可能会出现语法错误(甚至类型错误),例如: #ifdef FOO 对于(i=0;i

我想知道在面对C/C++代码中的ifdef时如何计算标准代码复杂性度量(例如,LOC、McCabe圈复杂度、Halstead度量等)

如果忽略ifdef,可能会出现语法错误(甚至类型错误),例如:

  • #ifdef FOO
  • 对于(i=0;i
  • #否则
  • 对于(i=0;i
  • #恩迪夫
  • printf(…)
  • }
  • 如果忽略第1行、第3行和第5行,则生成的代码将有一个循环在另一个循环中,并且缺少“}”(因此出现语法错误)

    如果考虑了#ifdef,则每个变量需要一个单独的结果度量(在本例中,定义了FOO时需要一个度量,未定义FOO时需要另一个度量)。然而,这种方法在实践中很容易爆发

    看,主页 报告说:

    解析 pmccabe忽略所有cpp预处理器指令-计算 代码外观的复杂性,而不是复杂性 在预处理器破坏代码之后。这一点尤其重要 因为像getchar(3)这样简单的东西会扩展成宏,从而增加 复杂性

    但是,正如我所说的,这种方法可能会导致出现代码错误,从而阻碍计算过程或导致错误的值

    工具如何克服这个问题(如果它们真的克服了的话)


    如果您将该构造重写为

    #ifdef FOO
    # define LOOPEND x
    #else
    # define LOOPEND y
    #endif
    
    或者类似的,应该没有问题

    如果您不想这样做,并且您的复杂性检查器不了解预处理器,您可以在定义了
    FOO
    和未定义了
    FOO
    的情况下,在预处理器的输出上运行它,然后取它产生的最大值,以获得实际复杂性的下限。使用GCC,预处理器通过
    GCC-E
    调用;其他编译器也有类似的选项


    (当然,如果你有很多这种CPP魔法,你会有指数级的可能性。但这是你为使用预处理器而付出的代价;这同样适用于测试。)

    许多度量计算器不使用完整或一致的解析器,而是使用(可能)翻译的前两个阶段,然后寻找关键词


    因为他们没有像您描述的那样考虑完整的语法问题,所以不要阻止他们。无论它们在其他方面如何变得脆弱,事实上,我已经看到cyclo-2.0在可靠的生产代码上完全失败。

    我会认为在一个更大的项目中(而不是一个20行的“实验”)影响代码实际复杂度的
    #ifdef
    和类似内容的数量非常少-您希望这些类型的表达式中的大多数都是独立的单元,不会对总体分数产生太大的影响


    但是,是的,如果您有一个小的代码集,其中包含大量的
    #ifdef
    以及
    #ifdef
    部分的复杂性,那么您可能会得到一个很大的错误。手动检查代码可以告诉您这一点

    第一部分:如何度量现有C/C++代码中的复杂性度量?我们谈论的是数百万行代码,所以重写是不可能的。第二部分:给定一个包含数百个宏变量的代码库(2^n,其中n表示这样的宏)@LeonardoPassos:depends。您需要复杂度数据的目的是什么?您好,正如上面的评论(参见larsmans的评论)所述,手动工作甚至组合工作都不是一个选项:(是的,但我提到的手动工作仅适用于小应用程序-如果是一个大项目,您的结果肯定会几乎相同!