我有我的软件v1和v2版本。 V1使用注册表来保存设置,有很多呼吁GetProfileInt的,等等。现在V2使用一个SQLite数据库保存设置。
我们目前正在开发两个分支,并从V1到V2的分支合并新功能。 目前,我们必须记住更新任何注册表调用来使用新的配置数据库,这已经错过了几次。
我想是抛出一个编译错误,如果任何GetProfile ...或WriteProfile的...功能在V2使用。
我们使用C ++在Visual Studio 2010中,如果有什么建于我可以使用输出从脚本以某种方式抛出一个编译器错误?
由于这个答案被接受我还不如包括提问者实际使用的解决方案:
jacobsee发现弃用的编译
#pragma deprecated(GetProfileInt)
原来的答案:
您可以宣告它们作为使用过时__declspec(deprecated)
。 它是这样的:
UINT __declspec(deprecated) WINAPI GetProfileInt(
__in LPCTSTR lpAppName,
__in LPCTSTR lpKeyName,
__in INT nDefault
);
你必须从包含在你关心的每个翻译单元的标题这样做。 这样做会导致一个警告任何时候转换单元,其中包括过时的声明使用该功能。
如果你想有一个编译器错误,如果你的项目没有已警告视为错误,那么你就必须把这一对,也许修复所有你已经忽略了警告。 (这些都是你是否使用此解决方案或不好的做法。)
促进我一个答案的评论:
您可以使用宏来重新定义他们的东西,不会编译:
#define GetProfile HAHA_Nice_try_This_will_not_compile!!!
美中不足的是,你需要确保它不是(合法)叫你的代码之外。
(所以你应该把宏观所有的包括后)。
如果你有一个#include文件,它是常见的,你可以添加这样的事情给它(与W
或A
适当的)。 这将导致,至少,一个链接错误(编译器警告/错误将取决于标志):
#define GetProfileIntA InvalidFunctionDoNotCallMe
窗户已经定义了功能,如GetProfileInt
为宏到A或W版本。
接受的答案是不推荐使用标记的功能,但是,这并不真正适合什么的问题是问,有两个原因:
- 它只是给出了一个警告,而不是错误。
- 它会给即使您正在使用的V1代码警告。
有充分的理由希望这样,但它实际上并不是原来的问题问什么。
幸运的是,有一个非常简单的方法来得到了什么问题询问。 编译器总是抛出一个错误,如果功能根本不存在。 只是扔功能于一身的#ifndef
。
#ifndef V2
void GetProfile()
{
// Get the profile
}
void WriteProfile()
{
// Write the profile
}
#endif
我相信你可以#define GetProfileInt(a, b, c) "don't use this";
之后#include
“荷兰国际集团Windows.h
。
由于GetProfileInt
是路由到适当的功能的宏,这将导致宏重新定义。 而且,由于char[]
不能被分配给UINT
,编译器error
的。
这是一个肮脏,肮脏的黑客不过,我觉得自己像洗澡来讨论它。