Archive for 13 10 月, 2011

TRACE TRACEA Macro

星期四, 13 10 月, 2011
void _TRACE(TCHAR *pszFormat, ...)
{
 if(lstrlen(pszFormat) > 512)
 {
  return;
 }

 TCHAR buffer[1024] = {0};
 va_list argptr;
 va_start(argptr, pszFormat);
 wvsprintf(buffer, pszFormat, argptr);
 va_end(argptr);
 OutputDebugString(buffer);
}

void _TRACEA(char *pszFormat, ...)
{
 if(strlen(pszFormat) > 512)
 {
  return;
 }

 char buffer[1024] = {0};
 va_list argptr;
 va_start(argptr, pszFormat);
 vsprintf(buffer, pszFormat, argptr);
 va_end(argptr);
 OutputDebugStringA(buffer);
}

#ifdef _DEBUG
#define TRACE _TRACE
#define TRACEA _TRACEA
#else
#define TRACE
#define TRACEA
#endif

之前在项目中自己封装用的。

调试输出信息在output窗口
vc 调试信息输出

__declspec(novtable)

星期四, 13 10 月, 2011

novtable:

可用于任何类声明中,但最好只用于纯接口类,即类本身从不实例化。此关键字的声明将阻止编译器对构造和析构函数的vfptr的初始化。可优化编译后代码大小。

如果试图实例化一个用__declspec(novtable)声明的类然后访问类中成员,则会在运行时产生访问错误(access violation,即AV)。

C++中 _declspec(novtable) 的探讨

Debug

星期四, 13 10 月, 2011

对调试目标进程是被其他进程拉起的时候很有效果,如IE、FireFox插件。

指向数组的指针

星期四, 13 10 月, 2011
// [2][3][4]
 char (*p)[3][4]  = (char (*)[3][4])malloc(2 * 3 * 4);
 memset(p, 'a', 2 * 3 * 4);
 p[1][2][0] = 'b';
 p[1][2][1] = 'b';
 p[1][2][2] = 'b';
 p[1][2][3] = 'b';
 for(int i = 0; i < 2; ++i)
 {
  for(int j = 0; j < 3; ++j)
  {
   for(int x = 0; x < 4; ++x)
    printf("%c", p[i][j][x]);
  }
 }

老忘记,记录一下。为什么指向char [2][3][4]数组的指针不是char (*)[2][3][4]呢?想想指向一维数组的指针为什么不是char (*)[4]你就知道了,因为当你使用类似p[x][][]时,第一个[]定位p的位置!

Can we believe our eyes?

星期四, 13 10 月, 2011

Can we believe our eyes?