这段ATL代码什么意思?

Cline 2008-10-29 09:26:02
问题一:
// Verify that a null-terminated string points to valid memory
inline BOOL AtlIsValidString(LPCSTR psz, size_t nMaxLength = UINT_MAX)
{
(nMaxLength);
return (psz != NULL);
}

"(nMaxLength);"这一句有什么作用?

问题二:

#define USES_CONVERSION_EX int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = NULL; (_lpw_ex); LPCSTR _lpa_ex = NULL; (_lpa_ex); USES_ATL_SAFE_ALLOCA

(_convert_ex);有啥用?

问题三:
#define ATLASSUME(expr) do { ATLASSERT(expr); __analysis_assume(!!(expr)); } while(0)

为什么要do-while语句?
...全文
128 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅得不敢出门 2008-10-29
  • 打赏
  • 举报
回复
#define ATLASSUME(expr) do { ATLASSERT(expr); __analysis_assume(!!(expr)); } while(0)
为什么要用do……while(0)把宏定义的多条语句括起来?
答案:

这是一个奇怪的循环,它就只会运行一次,为什么不去掉外面的do{..}while结构呢?原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会出现。下面是解释:

假设有这样一个宏定义

#define macro(condition) \

if(condition) dosomething()

现在在程序中这样使用这个宏:

if(temp)
macro(i);
else
doanotherthing();

一切看起来很正常,但是仔细想想。这个宏会展开成:

if(temp)
if(condition) dosomething();
else
doanotherthing();

这时的else不是与第一个if语句匹配,而是错误的与第二个if语句进行了匹配,编译通过了,但是运行的结果一定是错误的。

为了避免这个错误,我们使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时
因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。

另一个讲解:

这是为了含多条语句的宏的通用性,因为默认规则是宏定义最后是不能加分号的,分号是在引用的时候加上的比如定义了一个宏fw(a,b),那么在c文件里一定是这样引用
fw(a,b);

如果不用do...while,那么fw就得定义成:

#define fw(a,b) {read((a));write((b));}
那这样fw(a,b);展开后就成了:
{read(a);write(b);};
最后就多了个分号,这是语法错误,(注意的是:实际多数C编译器完全可以顺利通过编译,并且不影响结果,所以对于这种说法要辨证的看待)

而定义成do...while的话,展开后就是:
do{read(a);write(b);}while(0); 完全正确

几个典型的宏定义函数:

1)

#define nwkBusy() (nwkState != NWK_STATE_IDLE)

2)

#define nwkDoService() \
a_nwk_service.status = LRWPAN_STATUS_NWK_INPROGRESS;\
nwkState = NWK_STATE_COMMAND_START;\
nwkFSM();
3)
#define conPrintROMString(s) \
{\
static ROMCHAR xxxxromstr[] = s;\
conPrintROMString_func(xxxxromstr);\
}


http://blog.sina.com.cn/s/blog_4e6ed18d0100aqp3.html
Cline 2008-10-29
  • 打赏
  • 举报
回复
非常感谢!
yxz_lp 2008-10-29
  • 打赏
  • 举报
回复
问题1,2,都是防止编译器警告(未使用的变量),问题3,同问。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧