C语言关于变量定义未使用编译警告warring
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相关推荐
- c语言变量定义位置区别,C语言中变量定义的位置(C89和C99的区别)
C语言中变量定义的位置(C89和C99的区别) 在C++和JAVA中,按照语法,我们可以把变量定义在任何位置,所以很多人习惯了"哪里使用哪里定义"的这种做法,所以当用C语言进行编程 ...
- C语言中变量定义的位置
今天编了一道C语言程序,编译的时候,出现错误,源码如下: //输入一行字符串,统计大小写字母,空格的个数 #include<stdio.h> #include<string.h> ...
- c语言布尔变量定义,C语言布尔类型介绍 C语言标准(C89)没有定义布尔类型,如果你使用true...
10的叠乘值为 3628800 输出结果为: //导入 stdbool.h 来使用布尔类型#include #include //计算n!,n的值在main中定义int main(void){ int ...
- c语言错位机密算法,c – VS编译警告:32位移位的结果隐式转换为64位
Visual Studio 2013在以下问题上发出令人烦恼(并且看似无关紧要)的编译警告: #include #define PRECISION 16 uint64_t hi = 0; for (u ...
- C语言可以使用变量定义数组
这是在一次研讨会中发现的我知识上的纰漏,在此进行记录. 当时想给学弟学妹讲一下关于动态内存的问题,在讲述时我用了一个初始化变量时不能用变量作为下标.例如: int i = 5; char test[i ...
- c语言变量申明和定义区别,C语言中变量定义与声明的区别
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介 ...
- c语言位域变量定义,C语言位域_Lee_1985的博客的技术博客_51CTO博客
位域又叫位结构,位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便,位域多用于结构体中,在操作系统底层代码使用较多. 位结构定义的一般形式为: struct位结 ...
- 单片机声明数组可变长度c语言keil,单片机用byte定义数组keil编译警告 missing';'before...
警告如下: missing';'before sz 单片机源码如下: #include #include "intrins.h" int x; sbit d6=P2^6; sbit ...
- 单片机c语言字符,单片机C语言中变量的定义方法解析
描述 1.C语言中变量的定义方法 -C语言中变量定义语法为: #pragma rambank0 :即以关键词#pragma开始,rambank0指明资料区块为第0块. unsigned char m_ ...
最新文章
- ffmpeg连接超时与解码超时
- 百度地图API公交检索示例 - 标绘结果路线、返回结果集
- Android—ActivityThread与Handler
- Linux下精准踢掉登录用户-pkill命令
- 将命令结果赋给变量_不得不了解的quot;变量quot;(2)—— 变量的赋值
- 自定义 Web 服务器控件
- Position属性四个值:static、fixed、absolute和relative的区别和用法
- python实现JWT
- Linux ELF文件学习(1)
- java dht 爬虫_P2P中DHT网络爬虫
- Debian配置主机名,域名,网卡IP地址
- H5页面自定义标题、链接、描述、图片分享到微信朋友、朋友圈、QQ和QQ空间
- 连续变量的全概率和贝叶斯公式_条件概率、全概率公式与贝叶斯公式
- 【LabVIEW串口编程】03 串口接收
- 常见面试问题1:ZooKeeper、Redis、Mysql、JVM、Spring、Dubbo
- Delay Penalty for RNN-T and CTC
- 预装Windows 7系统如何验证系统正版授权
- css实现炫酷充电动画
- 有哪些禁忌需要注意的
- “OneNote由于某种原因,无法连接到服务器。请尝试检查您的连接以查看服务器是否可用。”的解决方案