我们从 UNREFERENCED_PARAMETER 开始吧。这个宏在 winnt.h 中定义如下:
#define UNREFERENCED_PARAMETER(P) (P)
  换句话说 UNREFERENCED_PARAMETER 展开传递的参数或表达式。其目的是避免编译器关于未引用参数的警告。许多程序员,包括我在内,喜欢用最高级别的警告 Level 4(/W4)进行编译。Level 4 属于“能被安全忽略的事件”的范畴。虽然它们可能使你难堪,但很少破坏你的代码。例如,在你的程序中可能会有这样一些代码行:

int x=1;
  但你从没用到过 x。也许这一行是你以前使用 x 时留下来的,只删除了使用它的代码,而忘了删除这个变量。Warning Level 4 能找到这些小麻烦。所以,为什么不让编译器帮助你完成可能是最高级别的专业化呢?用Level 4 编译是展示你工作态度的一种方式。如果你为公众使用者编写库,Level 4 则是社交礼节上需要的。你不想强迫你的开发人员使用低级选项清洁地编译他们的代码。
  问题是,Level 4 实在是太过于注意细节,在 Level 4 上,编译器连未引用参数这样无伤大雅的事情也要抱怨(当然,除非你真的有意使用这个参数,这时便相安无事)。假设你有一个函数带来两个参数,但你只使用其中一个:

int SomeFunction(int arg1, int arg2){     return arg1+5;}
使用 /W4,编译器抱怨:

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

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

  细心的人可能会问:既然你不使用 arg2,那当初为何要声明它呢?通常是因为你实现某个函数以满足某些API固有的署名需要,例如,MFC的 OnSize 处理例程的署名必须要像下面这样:

void OnSize(UINT nType, int cx, int cy);
  这里 cx/cy 是窗口新的宽/高,nType 是一个类似 SIZE_MAXIMIZED 或 SIZE_RESTORED 这样的编码,表示窗口是否最大化或是常规大小。一般你不会在意 nType,只会关注 cx 和 xy。所以如果你想用 /W4,则必须使用 UNREFERENCED_PARAMETER(nType)。OnSize 只是上千个 MFC 和 Windows 函数之一。编写一个基于 Windows 的程序,几乎不可能不碰到未引用参数。
  说了这么多关于 UNREFERENCED_PARAMETER 内容。Judy 在她的问题中还提到了另一个 C++ 程序员常用的并且其作用与 UNREFERENCED_PARAMETER 相同的诀窍,那就是注释函数署名中的参数名:

void CMyWnd::OnSize(UINT /* nType */, int cx, int cy){}
  现在 nType 是未命名参数,其效果就像你敲入 OnSize(UINT, int cx, int cy)一样。那么现在的关键问题是:你应该使用哪种方法——未命名参数,还是 UNREFERENCED_PARAMETER?
  大多数情况下,两者没什么区别,使用哪一个纯粹是风格问题。(你喜欢你的 java 咖啡是黑色还是奶油的颜色?)但我认为至少有一种情况必须使用 UNREFERENCED_PARAMETER。假设你决定窗口不允许最大化。那么你便禁用 Maximize 按钮,从系统菜单中删除,同时阻止每一个用户能够最大化窗口的操作。因为你是偏执狂(大多数好的程序员都是偏执狂),你添加一个 ASSERT (断言)以确保代码按照你的意图运行:

void CMyWnd::OnSize(UINT nType, int cx, int cy){     ASSERT(nType != SIZE_MAXIMIZE);     ... // use cx, cy}
  质检团队竭尽所能以各种方式运行你的程序,ASSERT 从没有弹出过,于是你认为编译生成 Release 版本是安全的。但是此时 _DEBUG 定义没有了,ASSERT(nType != SIZE_MAXIMIZE)展开为 ((void)0),并且 nType 一下子成了一个未引用参数!这样进入你干净的编译。你无法注释掉参数表中的 nType,因为你要在 ASSERT 中使用它。于是在这种情况下——你唯一使用参数的地方是在 ASSERT 中或其它 _DEBUG 条件代码中——只有 UNREFERENCED_PARAMETER 会保持编译器在 Debug 和 Release 生成模式下都没有问题。知道了吗?
  结束讨论之前,我想还有一个问题我没有提及,就是你可以象下面这样用 pragma 指令抑制单一的编译器警告:

#pragma warning( disable : 4100 )
4100 是未引用参数的出错代码。pragma 抑制其余文件/模块的该警告。用下面方法可以重新启用这个警告:

#pragma warning( default : 4100 )
  不管怎样,较好的方法是在禁用特定的警告之前保存所有的警告状态,然后,等你做完之后再回到以前的配置。那样,你便回到的以前的状态,这个状态不一定是编译器的默认状态。
  所以你能象下面这样在代码的前后用 pragma 指令抑制单个函数的未引用参数警告:

#pragma warning( push ) #pragma warning( disable : 4100 )void SomeFunction(...){}#pragma warning( pop )
  当然,对于未引用参数而言,这种方法未免冗长,但对于其它类型的警告来说可能就不是这样了。库生成者都是用 #pragma warning 来阻塞警告,这样他们的代码可以用 /W4 进行清洁编译。MFC 中充满了这样的 pragmas 指令。还有好多的 #pragma warning 选项我没有在本文讨论。有关它们的信息请参考相关文档。

UNREFERENCED_PARAMETER的作用 (unreferenced formal parameter 警告)相关推荐

  1. UNREFERENCED_PARAMETER的作用

    UNREFERENCED_PARAMETER(pParam); 跟踪到宏定义 #define UNREFERENCED_PARAMETER(P) (P) #define DBG_UNREFERENCE ...

  2. glm编译错误问题解决 formal parameter with __declspec(align(#39;16#39;)) won#39;t be aligned...

    參考:http://stackoverflow.com/questions/25300116/directxxmmatrix-error-c2719-declspecalign16-wont-be-a ...

  3. parameter bandwidth_type is not a formal parameter of instantiated module的解决方法

    昨日调试NIOS II的时候,用的是10.0的版本,在SOPC Builder中添加了ALT PLL模块,生成文件后,在Quartus II中无法编译,提示 Error (10130): Verilo ...

  4. 费诺编码c语言实验报告,formal parameter 4 different from declaration

    满意答案 tmns4194 2013.09.04 采纳率:46%    等级:11 已帮助:7769人 第一个问题: 你这里的声明和定义不一致,声明的时候,Fano函数的第四个参数是一个变量, 但是定 ...

  5. error : not in formal parameter list和invalid storage class

    情况是这样的,我在一个C文件中写了一个新函数后,并在主函数里使用了这个函数.在未写入这个函数时,程序是没有错误的.但是写入这个函数后,编译链接后,却突然出现很多报错.查明原因后,发现是在头文件声明时, ...

  6. UNREFERENCED_PARAMETER()宏函数

    vs2013开发C程序,当定义一个变量如int val,这个变量未被使用时,vs编译就会报错或报出警告信息:"warning C4100: ''XXXX'' : unreferenced f ...

  7. VS创建 Win32 应用程序(实现窗口的创建)

    VS创建 Win32 应用程序(实现窗口的创建)(二) 程序框架如下: 一.VS演示流程 打开VS----文件----新建----项目----Windows 桌面应用程序 二.生成代码:(大部分函数在 ...

  8. C/C++ 实现文件透明加解密

    今日遇见一个开超市的朋友,真没想到在高校开超市一个月可以达到月净利润50K,相比起我们程序员的工资,真是不可同日而语,这个世道啊,真是做程序员不如经商开超市, 我们高科技的从业者,真是造原子弹不如卖茶 ...

  9. VC中一个关于宏的使用问题 A2W W2A

    VC中一个关于宏的使用问题 文/赵湘宁 这儿是个关于宏的问题,我曾用过ATL的串转换宏,包括W2A,开始有些东西我还不太明白.为了使用这些宏,必须在函数的开始处用USES_CONVERSION来初始化 ...

最新文章

  1. JavaScript函数的反应性
  2. NAP客户端计算机隔离测试之五
  3. 【搜索】$P1092$虫食算
  4. 第八届蓝桥杯-日期问题
  5. python程序30行_Python30行代码实现对pdf文字内容的提取
  6. DOTA 2血虐人类的OpenAI,原来靠的是作弊?
  7. Http Live Streaming 实现iphone在线播放视频[转]
  8. 贺利坚老师汇编课程39笔记:用于内存寻址的寄存器同时引入BP
  9. js经典试题之数组与函数
  10. 创客匠人打造在线课堂,助力内容变现
  11. win7网络适配器_win7网络重置
  12. python语句分号_你知道分号在各种编程语言中的作用吗?
  13. 随机数字表法计算机分配,随机数字表法
  14. TSL2561 GY2561 模块 MSP430 单片机 程序 STM32 程序 光强传感器 MSP430F5529
  15. 《设计模式修炼真经》15 — 模板方法模式
  16. Firefox about:config设置
  17. maven 打包 程序包org.project.entity不存在
  18. 时间管理办法,如何对项目进行规划提高效率?
  19. UNRAID挂载exFat格式的USB磁盘
  20. SpringMVC视图视图控制器

热门文章

  1. (十)Centos之文件搜索命令find
  2. JAVA微信APP支付接口整合
  3. android什么时候会产生ANR
  4. 用Eclipse开发JavaWeb项目:错误信息 javax.servlet.http.HttpServlet was not found on the Java Build Path...
  5. 写了一个在线流程设计器,效果很炫[Siverlight版本]
  6. CCNP第四天(2) 配置、校验OSPF特殊区域类型-完全Stub区域
  7. ASP.NET防止按F5键造成表单重复提交
  8. Micropython TPYBoard 智能温控小风扇资料分享
  9. 全面接入「人脸识别」,智慧城市公共服务的另一种思路
  10. 前端学HTTP之网关、隧道和中继