UNREFERENCED_PARAMETER(P)

UNREFERENCED_PARAMETER(P)的作用
2008-03-25 14:19
转自:
http://hi.baidu.com/listenprogram/blog/item/21317200c9821215738b6572.html

在看<<Multithreading Applications in Win32>>时看到下面的一句代码:
UNREFERENCED_PARAMETER(pParam);

跟踪到宏定义
#define UNREFERENCED_PARAMETER(P)          /
    /*lint -e527 -e530 */ /
    { /
        (P) = (P); /
    } /


使用的方法比如:
DWORD WINAPI Fun(int arg1, int arg2)
{
UNREFERENCED_PARAMETER(arg2)
...
}

UNREFERENCED_PARAMETER 展开传递的参数或表达式。其目的是避免编译器关于未引用参数的警告。许多程序员,包括我在内,喜欢用最高级别的警告 Level 4(/W4)进行编译。Level 4 属于“能被安全忽略的事件”的范畴。虽然它们可能使你难堪,但很少破坏你的代码。例如,在你的程序中可能会有这样一些代码行:
int x=1;
  但你从没用到过 x。也许这一行是你以前使用 x 时留下来的,只删除了使用它的代码,而忘了删除这个变量。Warning Level 4 能找到这些小麻烦。所以,为什么不让编译器帮助你完成可能是最高级别的专业化呢?用Level 4 编译是展示你工作态度的一种方式。如果你为公众使用者编写库,Level 4 则是社交礼节上需要的。你不想强迫你的开发人员使用低级选项清洁地编译他们的代码。
  问题是,Level 4 实在是太过于注意细节,在 Level 4 上,编译器连未引用参数这样无伤大雅的事情也要抱怨(当然,除非你真的有意使用这个参数,这时便相安无事)。假设你有一个函数带来两个参数,但你只使用其中一个:
DWORD WINAPI Fun(int arg1, int arg2)
{
return arg1+5;
}
使用 /W4,编译器抱怨:

“warning C4100: ''arg2'' : unreferenced formal parameter.”
为了骗过编译器,你可以加上 UNREFERENCED_PARAMETER(arg2)。现在编译器在编译你的引用 arg2 的函数时便会住口。并且由于语句:

arg2;
实际上不做任何事情,编译器不会为之产生任何代码,所以在空间和性能上不会有任何损失。


类似的还有:

#define DBG_UNREFERENCED_PARAMETER(P)      /
    /*lint -e527 -e530 */ /
    { /
        (P) = (P); /
    } /
    /*lint +e527 +e530 */
#define DBG_UNREFERENCED_LOCAL_VARIABLE(V) /
    /*lint -e527 -e530 */ /
    { /
        (V) = (V); /
    } /
    /*lint +e527 +e530 */

你可能感兴趣的:(c,工作,编译器,fun,multithreading,winapi)