点击上方蓝字关注我,我们一起学编程
欢迎小伙伴们分享、转载、私信、赞赏

微信搜索:编程笔记本。
微信搜索:编程笔记本。
微信搜索:编程笔记本。

昨天在 review 同事的一个 MR 时,发现了一个比较有趣的问题,记录如下。

同时的 MR 修复的大概是这样一个问题:函数内部定义的某些局部变量仅用于 Log 语句,当 Log 关闭时,这些局部变量在整个函数作用域内就都未被使用过,所以在编译的时候就会报**变量未使用**的警告信息。

程序中的 Log 语句主要是帮助开发人员调试程序的,主要是打印一些程序运行的中间状态和提示信息。所以在一般的生产环境,特别是在内存比较有限的场景下,通常都是关闭 Log 的。

场景还原:

#include <stdio.h>#define DEBUG_CONTEXTvoid fun(void)
{int age = 1;
#ifdef DEBUG_CONTEXTprintf("The age is %d.\n", age);
#endif
}int main()
{fun();return 0;
}

Tips: 需要打开编译器的警告选项,才能输出编译器警告。笔者使用的是 gcc 编译器,相应的警告选项为 -Wall

下面我们来编译运行一下:

➜  $ gcc -Wall test.c -o test
➜  $ ./test
The age is 1.

微信搜索:编程笔记本。
微信搜索:编程笔记本。
微信搜索:编程笔记本。

如果我们将 Log 语句删除以减小程序体积,我们可以删除用于控制调制的宏:#define DEBUG_CONTEXT 。这样,printf 语句将不会出现在可执行文件中。此时,局部变量 age 就成了未使用的局部变量

#include <stdio.h>//#define DEBUG_CONTEXTvoid fun(void)
{int age = 1;
#ifdef DEBUG_CONTEXTprintf("The age id %d.\n", age);
#endif
}int main()
{fun();return 0;
}

再来编译运行一下:

➜  $ gcc -Wall test.c -o test
test.c:7:9: warning: unused variable 'age' [-Wunused-variable]int age = 1;^
1 warning generated.

可以看到,由于 printf 不再存在,局部变量 age 就未被使用,所以编译时就会出现 -Wunused-variable 警告。


看到这里,小伙伴是不是以为就结束啦?哈哈哈,下面才是今天的主题哦,且看!

微信搜索:编程笔记本。
微信搜索:编程笔记本。
微信搜索:编程笔记本。

对汇编了解的朋友都知道,函数传入的参数也属于当前函数作用于内的“局部变量”。但我仔细回想了一下,有的时候,我们未使用函数传入的参数好像并没有什么问题啊?

再来测试一下:

#include <stdio.h>void fun(int num)
{printf("Hello,world\n");
}int main()
{fun(0);return 0;
}

编译:

➜  $ gcc -Wall test.c -o test
➜  $

可以看到,未使用函数传入的参数并没有报出警告。

最终,在查阅 gcc 文档后,找到根本原因:

In order to get a warning about an unused function parameter, you must either specify -Wextra -Wunused (note that -Wall implies -Wunused), or separately specify -Wunused-parameter.

原来,函数传入的参数有一个其他的名称:function parameter 。从 gcc 文档可以知道,要想报出这样的警告,需要指定 -Wextra 选项。

再来测试一下:

➜  $ gcc -Wextra test.c -o test
test.c:3:14: warning: unused parameter 'num' [-Wunused-parameter]
void fun(int num)^
1 warning generated.

果然,这时候未使用的函数参数给出了警告信息 -Wunused-parameter

不知道,会不会有小伙伴有这样的疑问:这样的警告信息有什么用呢?
哈哈,看看下面的代码段你就知道啦!

#include <stdio.h>int add(int n1, int n2, int n3)
{return n1 + n2 + n2;
}int main()
{int sum = add(1, 2, 3);printf("The sum is %d.\n", sum);return 0;
}

有一天,你需要写一个三个数求和的功能,于是你编辑、编译、运行一气呵成,熟练得让人心疼~

➜  $ gcc test.c -o test
➜  $ ./test
The sum is 5.

:报告老师,1 + 2 + 3 = 5 。报告完毕,请指示!
老师:出门左转!!!

其实,我们经常容易手误敲错代码,要命的是有时候并不会触发编译错误,但逻辑已经不对了。就像上面的代码段,我们需要秋 n1n2n3 的和,一不留神把 n3 写成了 n2 。虽然程序不会报错,但是程序已经完全不对了。如果我们打开警告选项,就不会出现这种低级错误了。

➜  $ gcc -Wextra test.c -o test
test.c:3:29: warning: unused parameter 'n3' [-Wunused-parameter]
int add(int n1, int n2, int n3)^
1 warning generated.

编译器会提示我们,函数参数 n3 未使用。

总结:

  1. -Wall 选项仅仅能检测到未使用的局部变量,要检测未使用的函数参数,需要指定 -Wextra 选项。
  2. 编译器的警告选项最好打开,这能够帮助我们检查到很多问题。

微信搜索:编程笔记本。
微信搜索:编程笔记本。
微信搜索:编程笔记本。

GCC 编译器警告——【-Wunused-variable】【-Wunused-parameter】相关推荐

  1. iOS编程 手动忽略clang编译器警告

    iOS编程 手动忽略clang编译器警告 在iOS开发过程中, 我们可能会碰到一些系统方法弃用, weak.循环引用.不能运行之类的警告. 有代码洁癖的孩子们非常想消除他们, 今天就让我们来一次Fuc ...

  2. 【CentOS Linux 7】【gcc编译器】

    Linux系统及应用---调研报告 [CentOS Linux 7]实验1[VMware安装.新建虚拟机:63个基础命令运行结果图] [CentOS Linux 7]实验2[Shell编程及应用] [ ...

  3. GCC编译警告选项的学习

    GCC有很多的编译选项,警告选项:指定头文件.库路径:优化选项.本文针整理一下GCC的警告选项,主要依据http://gcc.gnu.org/onlinedocs/gcc/Warning-Option ...

  4. 为什么要始终启用编译器警告?

    本文翻译自:Why should I always enable compiler warnings? I often hear that when compiling C and C++ progr ...

  5. 通俗讲解Pytorch梯度的相关问题:计算图、torch.no_grad、zero_grad、detach和backward;Variable、Parameter和torch.tensor

    文章目录 with torch.no_grad()和requires_grad backward() Variable,Parameter和torch.tensor() zero_grad() 计算图 ...

  6. 转 vi 编辑器,gcc 编译器的使用

    vi编辑器是我们在linux下经常使用的文本编辑器,这个东西也是专门为程序员准备的,基本上每个Unix和Linux系统都为我们提供了这个软件,我们可以使用vi来编写我们的代码.在vi编辑器下所有操作都 ...

  7. Linux下的vim编辑器与gcc编译器及静动态库的制作

    1.vim编辑器的使用: (1)vim的三种模式: 命令模式:打开文件默认进入命令模式 编辑模式:需要输入一些命令切换到编辑模式 末行模式:在末行模式可以输入一些命令 命令模式aios和AIOS都可以 ...

  8. gcc编译器命令使用详解

    1.gcc包含的c/c++编译器 gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明白前面这半句是什 么意思:))一般c程序就用gcc编译,c++程序就用g++编 ...

  9. 把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器

    3.0 本讲目录 本系列视频,B站首发,up主: xiaobing1016 前言: GCC 编译器支持编译 Go.Objective-C,Objective-C ++,Fortran,Ada,D 和 ...

最新文章

  1. python爬虫抓取数据的步骤-Python爬虫抓取手机APP的传输数据
  2. U盘启动盘制作方法 2种绝招轻松搞定
  3. 神策数据:游戏企业如何做产品 A/B 测试?三大案例一次搞懂
  4. 多项式对数函数|指数函数(多项式)
  5. auot lisp 选择集处理_离散量的计算机处理63_1Cv6
  6. html div怎么设置圆角,jquery设置div圆角
  7. figma客户端_小白的Figma入门手册
  8. DWR整合Spring
  9. 国内从事机器视觉领域的公司
  10. python打字案例,Python 小案例 打字练习
  11. 手机自带计算机在线汇率,中美汇率换算计算器(汇率换算器在线 查询)
  12. nosqlbooster 破解free
  13. 传苹果将采用:夏普IGZO技术面板量产
  14. html5 自动分享到朋友圈,html5手机端分享微信朋友圈代码
  15. 后羿采集器怎么导出数据_后羿采集器如何采集亚马逊评论
  16. 社会主义市场体系与宏观调控
  17. 机器人电焊电流电压怎么调_电焊电流的调节技巧
  18. 网页设置通栏后,缩小页面有一部分不显示
  19. 简单python爬取微博并写入excel
  20. 第五届河南省程序设计大赛——B 最强DE战斗力(找规律、大数定理)

热门文章

  1. 120 个 常用excel模板 推荐
  2. 通过静态LSP、LDP LSP、MPLS TE三种方式实现总部与分支的互通
  3. 二维数组的初始化(详解)
  4. 设计一个算法求象棋这些棋子各代表哪些数字
  5. 5年内禁用支付宝和微信支付!多地公安出手:这些人摊上大事了
  6. picoCTF Web1
  7. 如何使用Java来发送企业邮箱,并设计收到邮件的样式
  8. 计算机组装与操作系统安装实验报告,操作系统安装实验报告(共10篇).docx
  9. 一键训练 deeplabv3seg、squeezeseg、voxelnet Docker镜像安装
  10. live555学习-H264VideoStreamParser详解