【发布时间】:2014-05-22 19:46:44
【问题描述】:
简短的故事:我想在某些条件编译的代码块中强制执行运行时条件检查,而不是在其他代码块中。
长篇大论:
我们的 C 代码库严重依赖分析。
我们有很多不同的配置文件,几乎每个模块都有#ifdefs,用于至少 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> 和<B> 下配置的新块时检查这种情况,而不是在<C> 下配置的代码。
理论上,如果存在#ifdef <A> 或#ifdef <B> 不直接跟在if (new_condition) 之后,那么最好的解决方案可能是使构建过程失败。
问题是,我不知道这样做。你们有吗?
【问题讨论】:
-
A、B 和 C 可以存在于同一个程序中还是属于同一个“编译器开关”?
-
它们都可以存在于同一个程序中,是的。大多数时候每次出现几次,有时又相互嵌套。它们可以包装大块代码,或者只是一个命令,或者介于两者之间的任何东西。
标签: c c-preprocessor conditional-compilation