WEB开发网
开发学院软件开发VC VC中一个关于宏的使用问题 阅读

VC中一个关于宏的使用问题

 2006-07-21 11:43:12 来源:WEB开发网   
核心提示:这儿是个关于宏的问题,我曾用过ATL的串转换宏,VC中一个关于宏的使用问题,包括W2A,开始有些东西我还不太明白,这种警告在C时代很有用,你必须在每个函数的顶部声明变量,为了使用这些宏,必须在函数的开始处用USES_CONVERSION来初始化某些局部变量

这儿是个关于宏的问题,我曾用过ATL的串转换宏,包括W2A,开始有些东西我还不太明白。为了使用这些宏,必须在函数的开始处用USES_CONVERSION来初始化某些局部变量。用就用吧,但是看看这个宏的定义,它有类似下面的代码: // 在atlconv.h文件中
#define USES_CONVERSION \
int _convert; _convert; \
UINT _acp = GetACP(); _acp; \
LPCWSTR _lpw; _lpw; \?
LPCSTR _lpa; _lpa
为什么它们用“int x;x;”——这种后面跟着变量的声明? 

很多人都碰到过这个令人困惑的问题,后来发现答案很简单:禁止编译器的警告信息(warning)。如果单独有一行代码:

int x;

且从来没有使用过x,那么编译器汇报错“unreferenced local variable:x”,意思是未引用过的局部变量x,如果将警告信息的输出调到最大。为了避免讨厌的警告,USES_CONVERSION引用声明的变量。 int x; // 声明
   x;   // 使用这个变量
   
在C++之前的时代,程序员有时在C中用函数形参做同样的事情来避免“unreferenced formal parameter”或其它的深奥费解的编译错误。 void MyFunc(int x, char y)
{
 x;
 y;
 ......
}
当然,现在用下面的代码可以更有效地完成同样的事情: // 参数 x 不是用
void MyFunc(int /* x */) 
{
  ......
}  
  也就是说声明参数,但不给它起名,不能这样使用局部变量;必须显式地引用它。这样做不会增加任何指令到代码中。最多可能多增加几个字节到堆栈(为x预留空间)。灵巧的编译器甚至不会操心x从来没有被使用过——虽然好奇心可能想知道:如果编译器够厉害,知道了从没有使用x,为什么要抱怨(编译出错)呢?答案是因为苛刻的程序员(且编程能力与个人的记性有关)使用编译警告提醒自己删除某部分代码时发生变量荒废。这种警告在C时代很有用,你必须在每个函数的顶部声明变量,这就远离了实用它们的代码。

1 2  下一页

Tags:VC 一个 关于

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接