C++ 代码复杂性度量和ifdef
我想知道在面对C/C++代码中的ifdef时如何计算标准代码复杂性度量(例如,LOC、McCabe圈复杂度、Halstead度量等) 如果忽略ifdef,可能会出现语法错误(甚至类型错误),例如:C++ 代码复杂性度量和ifdef,c++,c,c-preprocessor,C++,C,C Preprocessor,我想知道在面对C/C++代码中的ifdef时如何计算标准代码复杂性度量(例如,LOC、McCabe圈复杂度、Halstead度量等) 如果忽略ifdef,可能会出现语法错误(甚至类型错误),例如: #ifdef FOO 对于(i=0;i
如果您将该构造重写为
#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的评论)所述,手动工作甚至组合工作都不是一个选项:(是的,但我提到的手动工作仅适用于小应用程序-如果是一个大项目,您的结果肯定会几乎相同!