C++里消除Wunused

  编译程序时,有一大堆警告总是不爽的。别人的代码也就忍了,不好去改。自己的可没法忍。看看C++里怎么消除Wunused警告。

  先来看下面的程序:

#include <iostream>

int main(int argc,char **argv)
{
    int  a;

    return 0;
}

编译的时候,打开所有的警告:

[email protected]:~/code/test$ g++ -g -W -Wall -o unused unused.c
unused.c: In function ‘int main(int, char**)’:
unused.c:19:10: warning: unused variable ‘a’ [-Wunused-variable]
     int  a;
          ^
unused.c: At global scope:
unused.c:17:5: warning: unused parameter ‘argc’ [-Wunused-parameter]
 int main(int argc,char **argv)
     ^
unused.c:17:5: warning: unused parameter ‘argv’ [-Wunused-parameter]

可以看到,没有使用的变量、参数都给出了警告。警告是编译器给的,我们当然可以把编译选项中的-W -Wall去掉一了百了。可通常我们只是想告诉编译器:这个地方是我故意这样写的,不用警告我。其他地方有问题才警告我。那么就来看看编译器的__attribute__((unused))属性。这个属性可以在声明变量时指定变量是不需要用到的,不需要警告。如:

#include <iostream>

int main(int argc,char **argv)
{
    int  a __attribute__((unused));

    return 0;
}

编译时就不会再提示变量a未使用:

[email protected]:~/code/test$ g++ -g -W -Wall -o unused unused.c
unused.c:17:5: warning: unused parameter ‘argc’ [-Wunused-parameter]
 int main(int argc,char **argv)
     ^
unused.c:17:5: warning: unused parameter ‘argv’ [-Wunused-parameter]

对__attribute__((unused))稍微包装一下,就有了网上广为流传的版本:

#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@[email protected]*/ x
#else
# define UNUSED(x) x
#endif

#include <iostream>

int main(int UNUSED(argc),char **UNUSED(argv))
{
    int  UNUSED(a);

    return 0;
}

这样编译时就完全没有警告了。不过,如果有人没注意看你的代码,又使用变量a,则会提示error: ‘a’ was not declared in this scope。

  上面的方法是GNUC里提供的,而Qt里有一个Q_UNUSED,它的实现在qglobal.h里。

#ifndef Q_TYPENAME
#  define Q_TYPENAME typename
#endif

//
// Use to avoid "unused parameter" warnings
//
#define Q_UNUSED(x) (void)x;

//
// Debugging and error handling
//

#if !defined(QT_NO_CHECK)
#  define QT_CHECK_STATE            // check state of objects etc.
#  define QT_CHECK_RANGE            // check range of indexes etc.
#  define QT_CHECK_NULL                // check null pointers
#  define QT_CHECK_MATH                // check math functions
#endif

当然,我们也可以按它的方式去做,不过它是在使用的时候(声明一个int (void)a可以编译通过,在函数的参数里则不行),而GNUC方法是在声明的时候。按Qt的方法:

#define UNUSED(x) (void)x

#include <iostream>

int main(int argc,char **argv)
{
    int  a;

    UNUSED(a);
    UNUSED(argc);
    UNUSED(argv);

    return 0;
}

这样编译也是没有警告的。

  上面两种方法处理后,用 g++ -S unused.c生成汇编代码来对比,与下面的程序是一致的,不会生成多余的代码,没有效率的问题:

#include <iostream>

int main()
{
    return 0;
}
时间: 2024-07-30 17:19:53

C++里消除Wunused的相关文章

策略模式的孪生兄弟——对状态模式的深度复习总结

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 和策略模式的比较 状态模式概念和例子 应用场景 责任链模式和状态模式对比 一种代码优化的思路 java.util.Iterator里也有状态模式的影子 状态模式的优缺点 有限状态机及其应用 前面有总结——策略模式,之前早就觉得策略和状态设计模式有一些相似…… 接口的常用用法都有什么?策略设计模式复习总结 我知道策略模式是对象的行为模式,其实就是对一系列级别平等的算法的封装,它不关心算法实现,让客户端去动态的

PostgreSQL 数据库错误状态编号解释[附带列表

PostgreSQL 服务器发出的所有消息都赋予了五个字符的错误代码, 这些代码遵循 SQL 的 "SQLSTATE" 代码的习惯.需要知道发生了什么错误条件的应用通常应该测试错误代码,而不是查看文本错误信息.这些错误 代码轻易不会随着 PostgreSQL 的版本更新而修改,并且一般也不会随着错误信息的本地化而发生修改. 请注意有些,但不是全部,PostgreSQL 生成的错误代码是由 SQL 标准定义的: 有些标准没有定义的错误条件是我们发明的或者是从其它数据库借来的. 根据标准,

opencv3.1 + cmake3.5.2 + vs2015 配置

首先是下载与opencv的安装,之前已经写过opencv的了,这里就不写了,地址是:http://blog.csdn.net/lcc_633/article/details/51078869 附上下载cmake的地址:https://cmake.org/download/ 下载时要下载两个东西: 注意下载需要的版本,这里只介绍windows的 下载好后解压,然后在cmake-3.5.2-win32-x86的bin目录下双击运行cmake-gui.exe 然后出现下面的界面,出现时没有那个路径,找

sql server 基础语法2

别名,选择,查询,排序,去重,筛选 select * from UserInfo as ui --起别名 select UserName,UserPwd --指定选择的列 from UserInfo as ui select UserName as name --给列起别名 from UserInfo ui select top 2 * --查询前两行 from UserInfo select top 10 percent * --查询前百分之10 from UserInfo insert in

线性基专题总结

莫(tui)名(wan)其(ti)妙(jie)又弄完了一个专题? 刚开始以为这个知识点出题都是板子来着,后来做题才发现我太天真了啊 先列知识点吧 1.性质 (1). ?原序列异或能得到的所有数都可以由线性基中的一些数异或得到 (2).?线性基里面的任意一些数异或起来都不能得到 \(0\) (3).?线性基里面的数的个数唯一,并且在保持性质一的前提下,数的个数是最少的 (4).?若线性基中有k个元素,则原序列异或能得到的数一共有 \(2^k\) 种,每种有 \(2^{n-k}\) 个 (5).?线

CMOS图像传感器简介

概念 CMOS全称为Complementary Metal-Oxide-Semiconductor,具有通用性强.功耗低的技术特点.早期CMOS图像传感器的暗电流高.噪声大,使用上不及CCD广泛,如今随着技术的发展,CMOS图像传感器已成为市场主流.CMOS中主要的技术有X-Y寻址和有源像素结构. X-Y寻址 这种寻址方式可以做到低功耗,因为只有选中的像素被读出.读出方式有串行.列并行和像素并行.目前使用最广泛的是列并行方式.它是指一行中的所有列被同时读出,因此一行中的所有像素的曝光时间相同,此

CELERY里,这个WARNING如何消除?

原来命令行里有提示,保证用-n给与不同的名字即可. 比如: [program:celeryd]command=/usr/local/python27/bin/celery worker --app=settings -c 4 -l info -n celeryd [program:celerybeat]command=/usr/local/python27/bin/celery worker --app=settings -c 4 --beat -n celerybeat [2015-12-10

JS一趟循环消除一个数组里重复的元素

var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4]; function deRepeat(){ var newArr=[]; var obj={}; var index=0; var l=arr.length; for(var i=0;i<l;i++){ if(obj[arr[i]]==undefined) { obj[arr[i]]=1; newArr[index++]=arr[i]; } else if(obj[arr[i]]==1) continue; } ret

java里对多态的了解

java中多态性的理解 什么是多态? 1.面向对象的三大特性 封装,继承,多态,从一定角度看封装和继承都是为多态准备的. 2.多态的定义:允许不同的类对同一消息作出反应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式. 3.实现多态的技术叫做动态绑定,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 4.多态的作用是消除类型之间的耦合关系. 现实生活中多态的例子:比如f1在word里是word的帮助文档,在eclipse里就是eclipse的帮助文档,在不同的