Windows 小知识点汇总

_T()

1、定义

_T("")是一个宏,定义于tchar.h下。

#define   __T(x)  L ## x

#define   _T(x)  __T(x)

2、作用

它的作用是让你的程序支持Unicode编码,因为Windows使用两种字符集ANSIUNICODE,前者就是通常使用的单字节方式,但这种方式处理像中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。

Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。

如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。

LPSTR32bit指针指向一个字符串,每个字符占1字节。

LPCSTR:32-bit指针指向一个常字符串,每个字符占1字节。

LPCTSTR:32-bit指针指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义

LPTSTR:32-bit指针每字符可能占1字节或2字节,取决于Unicode是否定义。

L是表示字符串资源为Unicode的。

比如Wchar  _tStr[] =L"Hello World!",这个就是双字节存储字符了。

_T是一个适配的宏~

#ifdef _UNICODE的时候

_T就是L

没有#ifdef _UNICODE的时候

_T就是ANSI的。

比如

LPTSTR  lpStr = new TCHAR[32];

TCHAR*  szBuf = _T("Hello");

以上两句使得无论是在UNICODE编译条件下还是在ANSI编译条件下都是正确编译的。

而且MS推荐你使用相匹配的字符串函数。

比如处理LPTSTR或者LPTCSTR的时候,不要用strlen ,而是要用_tcslen

否则在UNICODE的编译条件下,strlen不能处理wchar _t*的字符串。

T是非常有意思的一个符号(TCHARLPCTSTRLPTSTR_T()_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定。


#pragma pack(push,1)与#pragma pack(1)的区别

这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。

#pragma pack(n)             作用:C编译器将按照n个字节对齐。
#pragma pack()               
作用:取消自定义字节对齐方式。


#pragma  pack (push,1)     
作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐。

#pragmapack(pop)            作用:恢复对齐状态

因此可见,加入pushpop可以使对齐恢复到原来状态,而不是编译器默认,可以说后者更优,但是很多时候两者差别不大

如:

#pragmapack(push) //保存对齐状态

#pragmapack(4)//设定为4字节对齐

相当于 #pragma  pack (push,4)  

 

#pragma pack 1           作用:调整结构体的边界对齐,让其以一个字节对齐;<使结构体按1字节方式对齐>

#pragma pack ()

例如:

#pragma pack(1)

struct sample
{
char a;
double b;
};

#pragma pack()

注:若不用#pragma pack(1)#pragma pack()括起来,则sample按编译器默认方式对齐(成员中size最大的那个)。即按8字节(double)对齐,则sizeof(sample)==16.成员char a占了8个字节(其中7个是空字节);若用#pragma pack(1),则sample1字节方式对齐sizeof(sample)==9.(无空字节),比较节省空间啦,有些场和还可使结构体更易于控制。

 

TRCE

该宏仅仅在程序的DEBUG版本中出现,当RELEASE的时候该宏就完全消失了,从而帮助你调试也在RELEASE的时候减少代码量。
使用非常简单,格式如下: TRACE("DDDDDDDDDDD"); TRACE("wewe%d",333); 同样还存在TRACE0,TRACE1,TRACE2。。。分别对应0,1,2。。个参数 TRACE信息输出到VC IDE环境的输出窗口(该窗口是你编译项目出错提示的那个窗口),但仅限于你在VC中运行你的DEBUG版本的程序。
TRACE信息还可以使用DEBUGVIEW来捕获到。这种情况下,你不能在VC的IDE环境中运行你的程序,而将BUILD好的DEBUG版本的程序单独运行,这个时候可以在DEBUGVIEW的窗口看到DEBUGVIEw格式的输出了。
VC中TRACE的用法有以下四种:
1: TRACE ,就是不带动态参数输出字符串, 类似C的printf("输出字符串");
2: TRACE 中的字符串可以带一个参数输出 , 类似C的printf("...%d",变量);
3: TRACE 可以带两个参数输出,类似C的printf("...%d...%f",变量1,变量2);
4: TRACE 可以带三个参数输出,类似C的printf("...%d,%d,%d",变量1,变量2,变量3);
TRACE 宏有点象我们以前在C语言中用的Printf函数,使程序在运行过程中输出一些调试信息,使我们能了解程序的一些状态。但有一点不同的是: TRACE 宏只有在调试状态下才有所输出,而以前用的Printf 函数在任何情况下都有输出。
和Printf 函数一样,TRACE函数可以接受多个参数如: int x = 1; int y = 16; float z = 32.0; TRACE( "This is a TRACE statement\n" ); TRACE( "The value of x is %d\n", x ); TRACE( "x = %d and y = %d\n", x, y ); TRACE( "x = %d and y = %x and z = %f\n", x, y, z ); 要注意的是TRACE宏只对Debug 版本的工程产生作用,在Release 版本的工程中,TRACE宏将被忽略。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值