限制函数在代码库中使用的时间

时间:2011-03-23 14:11:54

标签: c++ time compilation c-preprocessor

这是我正在尝试做的事情:

我有一个遗留函数,在我们的代码库中使用了3次。我想摆脱这个功能,但它需要一段时间。同时,我想阻止其他开发人员在其他地方使用该功能。有没有办法在编译时强制执行此操作,例如有错误吗?

有什么想法吗?

更新:我忘了提到我的函数位于命名空间中。

4 个答案:

答案 0 :(得分:4)

首先不要把它放在标题中。在.c文件中本地声明它,以便它不会公开显示。

然后你也可以这样做:

public_header.h:

     #define my_function(arg1, arg2, ...) exit(128)

在实际需要使用它的.cpp文件中:

     #undef my_function
     int my_function(int arg1, char *arg2, ...);

答案 1 :(得分:4)

对于gcc,您可以使用“已弃用”属性。

int old_fn () __attribute__ ((deprecated));

每次在某处使用函数时都会发出警告。

答案 2 :(得分:1)

作为C ++编号

的一部分

当然有诀窍。

一个这样的技巧是在当前使用点附近尽可能在本地声明函数。

  • 只需在源文件的顶部声明它即可使用它,就在包含
  • 的正下方
  • 在使用它的源文件顶部将其声明(并定义为)static,更好地提高可见性但隐含重复

通过默默无闻的安全性,并不是因为那么伟大而闻名,但我认为在这种情况下它是可以接受的(在功能之上有一个发表评论)。

其他解决方案包括标题中的#pragma warning(不好)或deprecated属性,但这会导致当前使用的警告,这可能会有问题(污染构建输出)。如果人们不打扰当前使用的警告,他们也不会打扰新警告,也不是一个好习惯进入!

现在,还有其他解决方案。

您可以简单地编写一个钩子来扫描源文件并计算出现次数。

grep -r "deprecated_func" include src | wc -l

此挂钩可以作为构建过程的一部分进行集成,也可以作为版本系统中的预提交挂钩进行集成。一旦你摆脱了一个函数,一定要减少允许出现次数。

注意:您还可以将deprecated属性与编译器输出上的过滤器一起使用。但这不计入-Werror

答案 3 :(得分:0)

非常有趣的问题!这让我想到升压预处理器的BOOST_PP_COUNTERBOOST_STATIC_ASSERT(或C ++ 0x的static_assert)的组合是否有效。一个大问题是每次我查看Boost.Preprocessor库时,都会让我头晕目眩:)

最后,我想写的是 BOOST_STATIC_ASSERT(BOOST_PP_COUNTER <= 3);

我现在没时间测试我的想法,但希望这可能会导致一些问题。直到周末我才能测试我的想法...