如何在C++中实现Deprecated API

原创 2004年07月17日 16:01:00

如何在C++中实现Deprecated API

How to deprecate an Api in C++

也许开发过程中第一次定义的某一接口是这样的:

   1|      

   2|     #pragma once

   3|     int SomeApiV1(char* byPtr);

   4|      

测试程序如下:

   5|     int main()

   6|     {

   7|         int value;

   8|         int ret = SomeApiV1 ((char*)&value);

   9|         printf("Value Return is %d, Param return is %#06x", ret, value);

10|         return 0;

11|     }

12|      

过了一段时间后,该函数的第二版定义成这样,第一版已经不用了.

13|     #pragma once

14|      

15|     int SomeApiV1(char* byPtr); //Deprecated

16|     int SomeApiV2(int& byRef);

17|      

实际上SomeApiV1已经成为SomeApiV2的包装.

18|     int SomeApiV1(char* byPtr)

19|     {

20|         int value;

21|         int ret = SomeApiV2(value);

22|         memcpy(byPtr, &value, sizeof(int));

23|         return ret;

24|     }

25|      

这时测试程序完全可以自然的编译通过.

如果测试程序的作者不查看头文件中的注释,完全不知道,接口已经被放弃.而可能一直使用旧接口.

如果接口改为:

26|     #pragma once

27|     int SomeApiV2(int& byRef);

28|      

29|     template <int IS_DEPRECATED>

30|     int SomeApiV1(char* byPtr);

31|      

32|     //

33|     // Deprecated Api wrap here

34|     //

35|     template <>

36|     int SomeApiV1<DEPRECATED>(char* byPtr)

37|     {

38|         int value;

39|         int ret = SomeApiV2(value);

40|         memcpy(byPtr, &value, sizeof(int));

41|         return ret;

42|     }

43|      

这时再编译测试程序,编译器会提示:

error C2783: “int SomeApiV1(char *)” : 未能推导出“IS_DEPRECATED” 的模板参数

        DeprecatedApi.cpp(22) : 参见“SomeApiV1”的声明

参见“SomeApiV1”的声明”!! OK,这就是我们所要的:提示程序作者接口已经放弃.

当然如果暂时还想使用旧版本,也没有关系.在代码中明确说明使用的是已放弃的接口.

即可:

44|     int main()

45|     {

46|         int value;

47|         int ret = SomeApiV1<DEPRECATED>((char*)&value);

48|         printf("Value Return is %d, Param return is %#06x", ret, value);

49|         return 0;

50|     }

51|      

 

SomeApiV1实现:

52|     int SomeApiV1(char* byPtr)

53|     {

54|         byPtr[0] = 0x00;

55|         byPtr[1] = 0x01;

56|         byPtr[2] = 0x00;

57|         byPtr[3] = 0x00;

58|      

59|         printf("SomeApiV1 called!/n");

60|         return 1;

61|     }

62|      

 

SomeApiV2实现:

63|     int SomeApiV2(int& byRef)

64|     {

65|         byRef = 0x0200;

66|         printf("SomeApiV2 called!/n");

67|         return 2;

68|     }

69|      

C++新特性:deprecated关键字

对大多数程序员来说,代码陈旧是个大问题。这个新属性提供了解决这个问题的系统方法。 在C++14中,增加关键字:deprecated,主要用于管理过时的函数、接口、类等。 它的用法方便又简单...
  • cbNotes
  • cbNotes
  • 2015年12月02日 16:11
  • 3070

C++库研究笔记--用__attribute__((deprecated)) 管理过时代码

用__attribute__((deprecated)) 管理过时代码,同时保留兼容的接口 Linux下: #define DEPR_AFTER __attribute__((deprec...
  • mathgeophysics
  • mathgeophysics
  • 2014年10月06日 14:30
  • 2887

Python数据分析示例(2)Day3

说明:本文章为Python数据处理学习日志,主要内容来自书本《利用Python进行数据分析》,Wes McKinney著,机械工业出版社。电影数据分析所需文件在Day2中下载,接下来要用到的一些文件的...
  • u010456562
  • u010456562
  • 2016年05月07日 11:38
  • 2374

用g++编译最简单的C++程序hello.C出现可以用-Wno-deprecated屏蔽的警告,想问个究竟

程序如下:      #include             main   ()      {              cout     }                警...
  • wujiangguizhen
  • wujiangguizhen
  • 2014年06月24日 17:48
  • 1594

STL中的智能指针(Smart Pointer)及其源码剖析: std::auto_ptr

STL中的智能指针(Smart Pointer)及其源码剖析: std::auto_ptr 本文主要介绍了 auto_ptr的使用及其源码。 auto_ptr是STL中的智能指针家族的成员之一, ...
  • yanglingwell
  • yanglingwell
  • 2017年02月20日 12:22
  • 11031

解决API property-resolver/variable-resolver is deprecated after JSF 1.1. Use el-resolver instead.

1. You probably know that the API variable-resolver has been deprecated afterJSF  1.1.JSF  2 use a ...
  • pfyuit
  • pfyuit
  • 2012年09月24日 12:30
  • 823

Google Web Search API (Deprecated)

Class ReferenceNote: The Google Web Search API has been officially deprecated as of November 1, 2010...
  • hack8
  • hack8
  • 2011年07月11日 21:27
  • 2828

#("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name:")

在使用visual studio 2015 写程序时 ,出现了(“The POSIX name for this item is deprecated. Instead, use the ISO C...
  • whappymanlynn
  • whappymanlynn
  • 2016年03月19日 12:33
  • 4104

JSP+JDBC实现简单用户登录模块【Deprecated】

这个例子中没有用session,仅是简单的JDBC测试程序 使用session的版本更好:详见http://blog.csdn.net/ruantao1989/article/details/804...
  • ruantao1989
  • ruantao1989
  • 2012年10月03日 18:18
  • 2969

基于Windows API的粒子随机运动C++实现

基于Windows API编写Windows动画演示程序,具有便捷、不依赖于IDE的特点。 以随机运动粒子系统为例,实现了该动画框架,C++代码与效果图像如下:...
  • alaclp
  • alaclp
  • 2015年04月15日 20:25
  • 918
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在C++中实现Deprecated API
举报原因:
原因补充:

(最多只允许输入30个字)