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

C++ 限制函数可在代码库中使用的时间,c++,time,compilation,c-preprocessor,C++,Time,Compilation,C Preprocessor,以下是我想做的: 我有一个遗留函数,在我们的代码库中只使用了3次。我想去掉这个函数,但它需要一些时间。同时,我想阻止其他开发人员在其他地方使用该函数。是否有办法在编译时强制执行此操作(例如,使用错误) 有什么想法吗 更新:我忘了提到我的函数驻留在名称空间中。首先,不要将它放在标题中。在.c文件中本地声明它,这样它就不会公开可见 您也可以这样做: 公共_头.h: #define my_function(arg1, arg2, ...) exit(128) #定义我的函数(arg1,arg2,…)退

以下是我想做的:

我有一个遗留函数,在我们的代码库中只使用了3次。我想去掉这个函数,但它需要一些时间。同时,我想阻止其他开发人员在其他地方使用该函数。是否有办法在编译时强制执行此操作(例如,使用错误)

有什么想法吗


更新:我忘了提到我的函数驻留在名称空间中。

首先,不要将它放在标题中。在.c文件中本地声明它,这样它就不会公开可见

您也可以这样做:

公共_头.h:

#define my_function(arg1, arg2, ...) exit(128) #定义我的函数(arg1,arg2,…)退出(128) 在实际需要使用它的.cpp文件中:

#undef my_function int my_function(int arg1, char *arg2, ...); #取消定义my_函数 int my_函数(int arg1,char*arg2,…); 对于gcc,您可以使用“弃用”属性

int old_fn () __attribute__ ((deprecated));
这将在每次使用函数时发出警告。

< P>作为C++ No.< 当然,也有一些技巧

其中一个技巧是在当前使用点附近尽可能局部地声明函数

  • 只需在源文件的顶部声明它,就可以使用它,在includes的正下方
  • 在使用它的源文件的顶部将它声明(并定义)为
    静态
    ,这有助于提高可见性,但意味着重复
它是默默无闻的安全性,并不是因为它的伟大而闻名,但我认为它在这种情况下是可以接受的(在函数顶部有一个粗俗的注释)

其他解决方案包括标题中的
#pragma warning
(不好)或
deprecated
属性,但这将导致当前使用的警告,这可能会有问题(污染生成输出)。如果人们不为当前使用的警告而烦恼,他们也不会为新的警告而烦恼,这不是一个好习惯

现在,还有其他解决方案

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

grep -r "deprecated_func" include src | wc -l
这个钩子既可以作为构建过程的一部分集成,也可以作为版本系统中的预提交钩子集成。请确保在删除一个函数后立即减少允许的出现次数


注意:您还可以将
不推荐使用的
属性与编译器输出上的过滤器一起使用。但是这不算是非常有趣的问题!这让我想到了boost预处理器和(或C++0x的static_断言)的组合是否可以工作。一个大问题是每次我查看Boost.Preprocessor库时,它都会让我头晕目眩:)

最后,我想写的是
BOOST_STATIC_ASSERT(BOOST_PP_COUNTER)其他解决方案提供编译时警告,而不是残酷的退出。嘿,你想阻止它们,对吗?我很想建议使用sleep(4000);@tibur:只需将#define更改为无法编译的内容(然后你会得到一个错误:甚至更好)。我还想在声明中添加
extern
。我想`#定义我的#函数(arg1,arg2,…)#错误“请不要使用它”会更好。我实际上已经尝试过了……你不能在#定义中使用#错误(这并不让我感到惊讶)。实际上,我希望此警告出现在函数的第四次使用中。是否可能?但是,您也会收到当前使用的警告。因此,
-Werror
无法再被激活。只需混合和匹配…使用不推荐的属性,并在需要的三种情况下使用pragma指令禁用警告(我认为这是可能的,从来没有尝试过那个特别的警告)它会发出警告,还会告诉你用法在哪里。或者只是重命名原始函数(例如
original\u function()
)而不使用不推荐的属性。然后用原始函数的名称创建一个新函数(如
function()\u attribute\uuuuuuuuuuu((不推荐)){original_function();}
),使其不推荐使用,并使用新名称调用该函数。然后修复这3次出现的情况,以使用重命名的函数(
original_function()
)。现有代码将编译而不抱怨,但如果有人使用它抱怨的不推荐使用的函数。