c - 在 C 代码块之前强制执行条件检查

标签 c c-preprocessor conditional-compilation

短篇小说:我想在某些条件编译的代码块中强制执行运行时条件检查,而不是其他代码块。

长话短说: 我们的 C 代码库在很大程度上依赖于分析。 我们有很多不同的配置文件,几乎每个模块都有 #ifdef s 用于至少 5-6 个不同的配置文件,包装大段代码。

我们添加了一个新要求 - 对于某些配置文件(比如 <A><B> ),条件编译的代码只有在满足特定条件时才会运行。对于其他配置文件(比方说 <C>),这不是必需的。

也就是说,代码现在是这样的:

#ifdef <A>
    /* Profiled code… */
#endif /* <A> */

#ifdef <B>
    /* Profiled code… */
#endif /* <B> */

#ifdef <C>
    /* Profiled code… */
#endif /* <C> */

这是我们需要的样子:

#ifdef <A>
    if (new_condition)
    {
        /* Profiled code… */
    }
#endif /* <A> */

#ifdef <B>
    if (new_condition)
    {
        /* Profiled code… */
    }
#endif /* <B> */

#ifdef <C>
    /* Profiled code… */
#endif /* <C> */

到目前为止,还不错。

但是,通过上述实现,新要求并不是真正可维护的。 它不会阻止任何不熟悉添加新配置文件代码块的要求的人,而不添加对 new_condition 的检查。 .

因此,我想强制我们的工程师在添加在 <A> 下分析的新 block 时检查此情况。和 <B> , 但不适用于 <C> 下的代码.

理论上,如果存在 #ifdef <A>,最好的解决方案可能是使构建过程失败的方法。或 #ifdef <B> if (new_condition) 后面没有直接跟上.

问题是,我不知道该怎么做。你们有吗?

最佳答案

我有理由相信它不能像描述的那样完成。您的工程师似乎可以编写从#ifdef 到#endif 的所有代码,而您拥有的唯一“ Hook ”是条件符号和条件。这还不够。一些半随机的想法:

  • 您可以将“条件”转换为函数调用并计算它被调用的频率。
  • 当所有条件都设置为 false 时,您可以要求某些“无效行为”。
  • 您可以创建一些函数,您的工程师必须在他们的 block 内调用才能访问某些内容,并在运行时检查如果条件为假,它不会被调用。

最终我认为您最好使用源代码分析工具来分析源代码并报告编码风格违规行为。那将是 CppCheck 或其中之一:http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis .

关于c - 在 C 代码块之前强制执行条件检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22965411/

相关文章:

c# - #if(DEBUG) 和 log4net 行号源/运行时不匹配

vim - 在vim中,如何查看我当前所在的#ifdef宏?

haxe - 基于Haxe编译器版本的条件编译?

haskell - Haskell 中的 CPP 扩展和多行文字

c - 如何获取空格分隔的数组值并将其存储在数组中?示例 : input in form 10 20 30 ouput:a[0]=10 a[2]=20 a[3]=30

c - 检测 http header 的结尾\r\n\r\n

任何人都可以解释这两个分配之间的区别以及为什么好坏?

c - i = (i,++i, 1) + 1; 是什么意思?做?

C/C++ 宏求值顺序

c - 如何判断 C 整型变量是否有符号?