请各位不吝指教,谢谢!
typeof.h:
1 /************************************************************************
2 * Detect a variable's type or kind
3 * by kusamba@126.com 2010-12-28
4 */
5 #pragma once
6
7 #include <typeinfo.h>
8 #include <string.h>
9 #include <assert.h>
10
11 #ifdef __cplusplus
12
13 /** detect static type/class */
14 #define IS_TYPE_OF(TYPE, variable) assert( 0 == _stricmp( typeid(TYPE).name(), typeid(variable).name() ) )
15
16 /** detect polymorphic type */
17 #define IS_KIND_OF(TYPE, ptr) assert( NULL != dynamic_cast<TYPE*>(ptr) )
18
19 #else
20
21 /** detect static type/class */
22 #define IS_TYPE_OF(TYPE, variable) assert( 0 == _stricmp( typeid(TYPE).name(), typeid(variable).name() ) )
23
24 /** detect polymorphic type */
25 #define IS_KIND_OF(TYPE, ptr) assert( 0 && "C Not Support Inheritance!" )
26
27 #endif
containerof.h
1 /************************************************************************
2 * Obtain the struct/class address by it's member address
3 * by Kusamba@126.com 2010-12-28
4 */
5 #pragma once
6
7 #include <stddef.h>
8
9 /** Linux Kernel.h GCC Define */
10 /**
11 #define container_of(ptr, type, member) ({ \
12 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
13 (type *)( (char *)__mptr - offsetof(type,member) );})
14 */
15
16 #ifdef __cplusplus
17
18 #ifdef _WIN64
19 #define CONTAINER_OF(ptr, TYPE, MEMBER) reinterpret_cast<TYPE*>( (ptrdiff_t)( reinterpret_cast<char*>(ptr) - offsetof(TYPE, MEMBER) ) )
20 #else
21 #define CONTAINER_OF(ptr, TYPE, MEMBER) reinterpret_cast<TYPE*>( ( reinterpret_cast<char*>(ptr) - offsetof(TYPE, MEMBER) ) )
22 #endif
23
24 #else
25
26 #ifdef _WIN64
27 #define CONTAINER_OF(ptr, TYPE, MEMBER) (TYPE*)( (ptrdiff_t)( (char*)(ptr) - offsetof(TYPE, MEMBER) ) )
28 #else
29 #define CONTAINER_OF(ptr, TYPE, MEMBER) (TYPE*)( ( (char*)(ptr) - offsetof(TYPE, MEMBER) ) )
30 #endif
31
32 #endif /* __cplusplus */
33
测试代码:
1 #include "stdafx.h"
2 #include "typeof.h"
3 #include "containerof.h"
4
5 //////////////////////////////////////////////////////////////////////////
6 // Test Kind/Type of
7 //////////////////////////////////////////////////////////////////////////
8 namespace _typeof_
9 {
10 class CA {};
11 class CB {};
12
13 struct SA {};
14 struct SB {};
15
16 class CP {};
17 class CC : public CP {};
18
19 void Test()
20 {
21 int int_a;
22 IS_TYPE_OF(int, int_a);
23 //IS_TYPE_OF(float, int_a);
24
25 int* pint_a;
26 IS_TYPE_OF(int*, pint_a);
27 //IS_TYPE_OF(int, pint_a);
28 //IS_TYPE_OF(float*, pint_a);
29 //IS_TYPE_OF(float, pint_a);
30
31 CA ca;
32 CA* pca;
33 IS_TYPE_OF(CA, ca);
34 IS_TYPE_OF(CA*, pca);
35 //IS_TYPE_OF(CA, pca);
36
37 //IS_TYPE_OF(CB, ca);
38
39 IS_KIND_OF(CA, &ca);
40
41 CP parent;
42 CC child;
43 IS_TYPE_OF(CP, parent);
44 //IS_TYPE_OF(CC, parent);
45 //IS_TYPE_OF(CP, child);
46 IS_TYPE_OF(CC, child);
47
48 IS_KIND_OF(CP, &parent);
49 //IS_KIND_OF(CC, &parent);
50 IS_KIND_OF(CP, &child);
51 IS_KIND_OF(CC, &child);
52
53 printf("type_of Done!\n");
54 }
55 }//namespace _typeof_
56
57 //////////////////////////////////////////////////////////////////////////
58 // container of test
59 //////////////////////////////////////////////////////////////////////////
60 namespace _container_of_
61 {
62 struct SA
63 {
64 int m_iA;
65 };
66
67 struct SB
68 {
69 int m_iB;
70 SA m_sa;
71 };
72
73 void Test()
74 {
75 SB val;
76
77 /**error C2039: 'm_iA' : is not a member of '_container_of_::SB'*/
78 /**not support nesting*/
79 //SB* pSB = CONTAINER_OF(&val.m_sa.m_iA, SB, m_iA);
80 /**end*/
81
82 SB* pSB = CONTAINER_OF(&val.m_iB, SB, m_iB);
83
84 IS_TYPE_OF(SB*, pSB);
85
86 printf("container_of Done!\n");
87 }
88 }//_container_of_
89
90 int _tmain(int argc, _TCHAR* argv[])
91 {
92 _typeof_::Test();
93 _container_of_::Test();
94
95 return 0;
96 }
97
摘要: 本文总结了stl deque常用的规范的使用方法,以及如何避免iterator失效,老鸟勿入!!!
阅读全文
摘要: 本文总结了stl vector常用的规范的使用方法,以及如何避免iterator失效,老鸟勿入!!!
阅读全文
解释:Alpha,Beta,RC,OEM各个版本
Alpha:
是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。
Beta:
也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。
RC:(Release Candidate)
顾名思义么 ! 用在软件上就是候选版本。系统平台上就是发行候选版本。RC版不会再加入新的功能了,主要着重于除错。
RTM:(Release to Manufacture)
是给工厂大量压片的版本,内容跟正式版是一样的,不过RTM版也有出限制、评估版的。但是和正式版本的主要程序代码都是一样的。
OEM:
是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。包装不像零售版精美,通常只有一面CD和说明书(授权书)。
RVL:
号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的。
EVAL:
而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别。
RTL:Retail(零售版)
是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是
EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试
版。_PRE,代表家庭版;_PRO,代表专业版。