这是我正在尝试做的事情:
我有一个遗留函数,在我们的代码库中使用了3次。我想摆脱这个功能,但它需要一段时间。同时,我想阻止其他开发人员在其他地方使用该功能。有没有办法在编译时强制执行此操作,例如有错误吗?
有什么想法吗?
更新:我忘了提到我的函数位于命名空间中。
答案 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_COUNTER和BOOST_STATIC_ASSERT(或C ++ 0x的static_assert)的组合是否有效。一个大问题是每次我查看Boost.Preprocessor库时,都会让我头晕目眩:)
最后,我想写的是
BOOST_STATIC_ASSERT(BOOST_PP_COUNTER <= 3);
我现在没时间测试我的想法,但希望这可能会导致一些问题。直到周末我才能测试我的想法...