DXUT源码阅读笔记

 

 

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 );

  

 

注释

1. #define中的 "##"

##是一个连接符号,用于把参数连在一起 #是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串

#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()

多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用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, 释放动态数组

 

你可能感兴趣的:(源码)