C语言关于变量定义未使用编译警告warring

  • 1.警告warring的产生
    • 1.1具体警告warring
    • 1.2解决方案
      • 1.2.1利用attribute 机制
      • 1.2.2利用void关键字
  • 2.总结

1.警告warring的产生

在日常写代码的过程中,定义的变量有时候只需要接收某个变量,仅仅对这个变量进行赋值,变量没有进行实际运算操作,这个时候编译器就会有警告。如果是这个原因导致的警告warring,你不处理也不会影响程序的运行。但是当你的工程所有编译的时候,总有几个warring影响你的最终结果,你要是个完美主义者或者是个处女座,总想解决这几个warring。

1.1具体警告warring

1.Keil MDK会有如下警告:

 **..main\main.c(36): warning:  #177-D: variable "i" was declared but never referenced
uint8_t i = 0;

2.IAR的编译警告信息:

Warning[Pe177]: variable "i" was declared but never referenced E:\Project\user\main.c 36

告诉你在main.c源文件的第36行,有个变量i声明了但没有使用,这些编译的器的警告信息描述都是大同小异。

3.用gcc编译器,打开警告信息编译:

gcc test.c -o test -Wall

编译信息如下:

test.c: In function ‘main’:
test.c:6:6: warning: variable ‘a’ set but not used [-Wunused-but-set-variable]int a = 0;^

告诉你在main.c源文件的第6行,有个变量a声明了但没有使用。

1.2解决方案

如何解决这个样的问题,这里给出两个解决方案(其实我也就只知道这两个,哈哈~~):

1.2.1利用attribute 机制

attribute 单词意思属性,就是用于配置变量或者代码段的属性。我们常用配置结构体的字节对齐,或者将代码编译到内存的固定地址。我们这里利用其中的一个属性__attribute__((unused))来表示这个变量可能会没有使用到,如下例子:

  1 #include <stdio.h>23 int main(void)4 {5     int a __attribute__((unused));67     return 0;8 }

就是告诉编译器变量a定义了,但有可能是不使用,所以编译器就不会有警告,因为你已经提前打过招呼了。

为了验证增加这个属性会不会对变量有所影响,我们将代码改回有警告的:

  1 #include <stdio.h>23 int main(void)4 {5     //int a __attribute__((unused));6     int a;78     return 0;9 }

我们可以将看编译后的反汇编文件进行对比发现文件都是一样的,如下是main函数部分的反汇编:

所以这两段的程序是一样的,增加属性并不会改变什么性质。

120 00000000004004d6 <main>:
121   4004d6:   55                      push   %rbp
122   4004d7:   48 89 e5                mov    %rsp,%rbp
123   4004da:   b8 00 00 00 00          mov    $0x0,%eax
124   4004df:   5d                      pop    %rbp
125   4004e0:   c3                      retq
126   4004e1:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
127   4004e8:   00 00 00
128   4004eb:   0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)

1.2.2利用void关键字

void在C语言的作用,很多时候使用仅仅用于无参数返回,这只是一个很基本的功能。很多时候我们定义函数指针、NULL的时候,我们都会使用到void这个关键字。void的意思是空、无的意思,我们利用这个特性将变量操作一波,如下:

  1 #include <stdio.h>23 int main(void)4 {5     //int a __attribute__((unused));6     int a;7     (void)(a);8     return 0;9 }

这里我们将变量a引用了一次,在前面增加(void),这样就能够避免编译器的警告,可以理解为告诉编译器我已经调用了这个变量,并且操作了它,这样编译器就不会有警告信息了。我们通过反汇编能够发现,这样操作以后,和前边attribute的是一样的,并不影响代码。

2.总结

最后我们得出结论,这两种花里胡哨的操作,其实不改变程序的任何执行,只不过是为了去除编译器的警告。正常使用的话会选择用void的比较多(就目前我发现),这个也比较好理解,因为我们写代码是给别人看的。通过这两种方法有没有发现C语言是越学越不懂,越学越有趣呢。最后的最后我们在编程的时候一定要做到0 error和0 warring,这样才是一名好的打工仔!!

C语言关于变量定义未使用编译警告warring相关推荐

  1. c语言变量定义位置区别,C语言中变量定义的位置(C89和C99的区别)

    C语言中变量定义的位置(C89和C99的区别) 在C++和JAVA中,按照语法,我们可以把变量定义在任何位置,所以很多人习惯了"哪里使用哪里定义"的这种做法,所以当用C语言进行编程 ...

  2. C语言中变量定义的位置

    今天编了一道C语言程序,编译的时候,出现错误,源码如下: //输入一行字符串,统计大小写字母,空格的个数 #include<stdio.h> #include<string.h> ...

  3. c语言布尔变量定义,C语言布尔类型介绍 C语言标准(C89)没有定义布尔类型,如果你使用true...

    10的叠乘值为 3628800 输出结果为: //导入 stdbool.h 来使用布尔类型#include #include //计算n!,n的值在main中定义int main(void){ int ...

  4. c语言错位机密算法,c – VS编译警告:32位移位的结果隐式转换为64位

    Visual Studio 2013在以下问题上发出令人烦恼(并且看似无关紧要)的编译警告: #include #define PRECISION 16 uint64_t hi = 0; for (u ...

  5. C语言可以使用变量定义数组

    这是在一次研讨会中发现的我知识上的纰漏,在此进行记录. 当时想给学弟学妹讲一下关于动态内存的问题,在讲述时我用了一个初始化变量时不能用变量作为下标.例如: int i = 5; char test[i ...

  6. c语言变量申明和定义区别,C语言中变量定义与声明的区别

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介 ...

  7. c语言位域变量定义,C语言位域_Lee_1985的博客的技术博客_51CTO博客

    位域又叫位结构,位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便,位域多用于结构体中,在操作系统底层代码使用较多. 位结构定义的一般形式为: struct位结 ...

  8. 单片机声明数组可变长度c语言keil,单片机用byte定义数组keil编译警告 missing';'before...

    警告如下: missing';'before sz 单片机源码如下: #include #include "intrins.h" int x; sbit d6=P2^6; sbit ...

  9. 单片机c语言字符,单片机C语言中变量的定义方法解析

    描述 1.C语言中变量的定义方法 -C语言中变量定义语法为: #pragma rambank0 :即以关键词#pragma开始,rambank0指明资料区块为第0块. unsigned char m_ ...

最新文章

  1. ffmpeg连接超时与解码超时
  2. 百度地图API公交检索示例 - 标绘结果路线、返回结果集
  3. Android—ActivityThread与Handler
  4. Linux下精准踢掉登录用户-pkill命令
  5. 将命令结果赋给变量_不得不了解的quot;变量quot;(2)—— 变量的赋值
  6. 自定义 Web 服务器控件
  7. Position属性四个值:static、fixed、absolute和relative的区别和用法
  8. python实现JWT
  9. Linux ELF文件学习(1)
  10. java dht 爬虫_P2P中DHT网络爬虫
  11. Debian配置主机名,域名,网卡IP地址
  12. H5页面自定义标题、链接、描述、图片分享到微信朋友、朋友圈、QQ和QQ空间
  13. 连续变量的全概率和贝叶斯公式_条件概率、全概率公式与贝叶斯公式
  14. 【LabVIEW串口编程】03 串口接收
  15. 常见面试问题1:ZooKeeper、Redis、Mysql、JVM、Spring、Dubbo
  16. Delay Penalty for RNN-T and CTC
  17. 预装Windows 7系统如何验证系统正版授权
  18. css实现炫酷充电动画
  19. 有哪些禁忌需要注意的
  20. “OneNote由于某种原因,无法连接到服务器。请尝试检查您的连接以查看服务器是否可用。”的解决方案

热门文章

  1. hyperledger fabric 实战开发——水产品溯源交易平台(二)
  2. html字体下划线下移,CSS下划线与文字间距距离设置(CSS文字下划线距离设置)
  3. 《星际迷航 超越星辰》
  4. 对客户信息收集,收集用户行为的方法总结
  5. vue element 实现table的自动添加列
  6. 当地图与绘画结合,竟然能迸发出这样的精彩
  7. shift键计算机功能,分享新手必会的快捷键:shift键的11个妙用!
  8. chrome和Firefox浏览器如何访问非安全端口站点
  9. 当点击按钮没有反应时的解决办法
  10. HTML中为什么点击按钮没有反应