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

  先来看下面的程序:

#include <iostream>

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

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

xzc@xzc-HP-ProBook-4446s:~/code/test$ g++ -g -W -Wall -o unused unused.c
unused.c: In function ‘int main(int, char**)’:
unused.c::: warning: unused variable ‘a’ [-Wunused-variable]
int a;
^
unused.c: At global scope:
unused.c::: warning: unused parameter ‘argc’ [-Wunused-parameter]
int main(int argc,char **argv)
^
unused.c::: warning: unused parameter ‘argv’ [-Wunused-parameter]

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

#include <iostream>

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

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

xzc@xzc-HP-ProBook-4446s:~/code/test$ g++ -g -W -Wall -o unused unused.c
unused.c::: warning: unused parameter ‘argc’ [-Wunused-parameter]
int main(int argc,char **argv)
^
unused.c::: 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) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif #include <iostream> int main(int UNUSED(argc),char **UNUSED(argv))
{
int UNUSED(a); return ;
}

这样编译时就完全没有警告了。不过,如果有人没注意看你的代码,又使用变量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 ;
}

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

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

#include <iostream>

int main()
{
int a;
return ;
}

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

  1. C语言博客作业05——指针

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量 1.2.1学习体会 可能因为之前数组那块儿的作业拖得太久了,以至于我觉得指针学的好快,还没反应过来就教完了,然后一开始做题的时候,就是一脸 ...

  2. PostgreSQL 数据库错误代码解释

    PostgreSQL 服务器发出的所有消息都赋予了五个字符 的错误代码, 这些代码遵循 SQL 的 "SQLSTATE" 代码的习惯.需要知道发生了什么错误条件的应用通常应该测试错 ...

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

    PostgreSQL 服务器发出的所有消息都赋予了五个字符的错误代码, 这些代码遵循 SQL 的 "SQLSTATE" 代码的习惯.需要知道发生了什么错误条件的应用通常应该测试错误 ...

  4. sql server 基础语法2

    别名,选择,查询,排序,去重,筛选 select * from UserInfo as ui --起别名 select UserName,UserPwd --指定选择的列 from UserInfo ...

  5. 策略枚举:消除在项目里大批量使用if-else的正确姿势

    文/朱季谦 想起刚开始接触JAVA编程的时候,若遇到大量流程判断语句,几乎满屏都是if-else语句,多得让自己都忘了哪里是头,哪里是尾,但是,纵然满屏是if-else,但彼时也没有觉得多别扭.等到编 ...

  6. CELERY里,这个WARNING如何消除?

    原来命令行里有提示,保证用-n给与不同的名字即可. 比如: [program:celeryd]command=/usr/local/python27/bin/celery worker --app=s ...

  7. 使用JS如何消除一个数组里重复的元素

    JS: var arrData = [1,3,5,7,7,8,9,3,10,8,"sdsdsds","sss","ffff","s ...

  8. Linux环境下shell和vim中乱码原因及消除办法

    shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...

  9. Linq to sql 有什么办法可以实现消除列重复?

    比如数据库里有一表,有两个字段:ID User1 小白2 小红3 小白 过滤User列为小白的重复项后,我想要得到:ID User1 小白2 小红 如果写db.linq.customer.Distin ...

随机推荐

  1. line-hight-(行高)解析

    行高定义:line-height属性是指文本行基线之间的距离. 顶线.中线.基线.底线概念 从上到下四条线分别是顶线.中线.基线.底线,很像才学英语字母时的四线三格,我们知道vertical-alig ...

  2. WebApi2官网学习记录---Html Form Data

    HTML Forms概述 <form action="api/values" method="post"> 默认的method是GET,如果使用GE ...

  3. 五种常见的ASP.NET应用程序安全缺陷

    下面给出了五个例子,阐述如何按照上述建议增强应用程序的安全性.这些例子示范了代码中可能出现的缺陷,以及它们带来的安全风险.如何改写最少的代码来有效地降低攻击风险.1 篡改参数◎ 使用ASP.NET域验 ...

  4. 《第一行代码》学习笔记3-活动Activity(1)

    1.活动-一种可以包含用户界面的组件,用于和用户进行交互. <Button android:id="@+id/button_1" android:layout_width=& ...

  5. hdu3714 三分

    Error Curves Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  6. hdu4296 贪心

    E - 贪心 Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     64bit I ...

  7. POJ1015 动态规划

    POJ1015 问题重述: 在n个候选者中选取m个人进入陪审团.每个候选者获得两项评分:D[j],P[j].求解最佳评审团,使得在每个成员的两项评分和之差 最小的情况下,使得两项评分和之和 最大. 分 ...

  8. 如何让checkbox复选框只能单选

    function框架div 如何让checkbox复选框只能单选 在项目开发中遇到一个这样的问题,要让一列复选框架在任何时间段内只能选择一个. 有人说怎么不用单选框了,因为单选框一旦选择了就不能取消选 ...

  9. OAuth 2.0 开发完全详解

    --------------------------基础篇------------------------------- I:OAuth 2.0 概述 首先大家来看看国内新浪跟腾讯这两大头对OAuth ...

  10. 百度地图api实例

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm11.aspx ...