标签:
1.GetSet方法的宏定义简便写法
//DXUT.cpp_Line50 #define SET_ACCESSOR( x, y ) inline void Set##y( x t ) { DXUTLock l; m_state.m_##y = t; }; #define GET_ACCESSOR( x, y ) inline x Get##y() { DXUTLock l; return m_state.m_##y; }; #define GET_SET_ACCESSOR( x, y ) SET_ACCESSOR( x, y ) GET_ACCESSOR( x, y )
使用时将x替换为形参,y替换为类中某个变量的后缀(例: m_state.m_D3D的后缀为D3D)
//example GET_SET_ACCESSOR( IDirect3D9*, D3D9 );
注释
##是一个连接符号,用于把参数连在一起 #是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串
#define paster( n ) printf( "token " #n" = %d\n ", token##n )
所以paster(9);就是相当于 printf("token 9 = %d\n",token9);
2.DXUTLock l;
//DXUT.cpp_Line32 class DXUTLock { public: inline DXUTLock() { if( g_bThreadSafe ) EnterCriticalSection( &g_cs ); } inline ~DXUTLock() { if( g_bThreadSafe ) LeaveCriticalSection( &g_cs ); } };
不了解线程安全方面的东西,看百度百科大概了解了一下
多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用EnterCriticalSection和LeaveCriticalSection函数。
2.指针、com接口安全释放 宏定义
//DXUT.h_Line117 #ifndef SAFE_DELETE #define SAFE_DELETE(p) { if (p) { delete (p); (p)=NULL; } } #endif #ifndef SAFE_DELETE_ARRAY #define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p)=NULL; } } #endif #ifndef SAFE_RELEASE #define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } } #endif
注意动态数组的释放(SAFE_DELETE_ARRAY) 比较特别,当释放一个指向数组的指针时,空方括号是必需的。它指示编译器此指针指向一个对象数组的第一个元素。
——C++Primer 5th P425, 释放动态数组
标签:
原文地址:http://www.cnblogs.com/Agravity/p/4681700.html