1. 警告的产生:

char *my_strstr(const char *str1,const char *str2)
{const char *s1 = NULL;const char *s2 = NULL;char *cp = str1;while (*cp){s1 = cp;s2 = str2;while (s1 && s2 && (*s1 == *s2)){s1++;s2++;}if (*s2 == '\0'){return cp;}cp++;}return NULL;
}
  • 编译时产生如下警告信息

9.7查找_strstr.c:37:11: warning: initializing 'char *' with an expression of type 'const char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]char *cp = str1;^    ~~~~
1 warning generated.
  • 警告信息的翻译是:

使用“const char*”类型的表达式初始化“char*”将丢弃限定符[-Wincompatible指针类型丢弃限定符]

  1. 警告信息产生的原因:

  • 警告信息的解读:

  1. 是由于使用“const char*”类型的表达式初始化“char*”将丢弃限定符

在代码中:

char *my_strstr(const char *str1,const char *str2)
char *cp = str1;
  1. 警告是由于第2行的语句产生的,

因为在形参中的参数由const所修饰,而在将被const修饰的类型赋值给没有const修饰的类型时发生了警告

  • 指针赋值时,左侧的操作数必须具有右侧操作数的全部限定修饰

  1. 如下面的例子

int main(void)
{int *a = NULL;const int *pa = a;return 0;
}

这个代码可以成功编译通过。因为赋值语句的左侧操作数具有右侧操作数的全部限定修饰符

  • 而如下代码在编译的时候就会发生警告

int main(void)
{const int *a = NULL;int *pa = a;return 0;
}//如下是警告信息
test_2.c:6:10: warning: initializing 'int *' with an expression of type 'const int *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]int *pa = a;^    ~
1 warning generated.

因为赋值语句的左侧操作数没有右侧操作数的const限定修饰符,因此发生警告

  1. 解决方法

  1. 赋值操作符的两个操作数具有相同的限定修饰(取消const修饰,或两侧都加上const修饰)
char *my_strstr(const char *str1,const char *str2)
const char *cp = str1;
  1. 进行强制类型转换
char *my_strstr(const char *str1,const char *str2)
char *cp = (char *)str1;

C语言编译时产生的警告:initializing ‘char *‘ with an expression of type ‘const char *‘ discards qualifiers相关推荐

  1. 【错误记录】Android 编译时技术版本警告 ( 注解处理器与主应用支持的 Java 版本不匹配 )

    文章目录 一.报错信息 二.问题分析 三.解决方案 一.报错信息 在使用 Android 编译时技术 , 涉及 编译时注解 , 注解处理器 ; 开发注解处理器后 , 编译报如下警告 ; 该警告不会影响 ...

  2. c语言编译时检查逻辑错误吗,C语言陷阱与技巧20节,自定义“编译时”assert方法,在代码编译阶段检查“逻辑”错误...

    在C语言程序开发中,程序员写代码时应该考虑的"面面俱到",这样才能写出功能稳定的程序.例如,在实现 open() 函数时,先完成它的功能固然是重要的,但是程序员还需要考虑各种&qu ...

  3. c语言编译说文件不存在,c语言编译时缺少头文件,库的解决办法

    问题产生原因 我们都知道我们写一个程序不可能所有东西都重头去开发,因此我们会使用一些其它人写好的文件或者说叫做库函数等.但是有时候因为路径的设置不对,或者是文件的丢失,或者是文件版本不对,或者是文件的 ...

  4. 【开发日常】【Makefile】编译时如何将警告(warning)视为错误(error)?

    我们有时会遇到内核编译时警告(warning)被视为错误(error)等问题 在内核源码中,移植外部驱动模块,出现报错: error: unused variable 'xxx' [-Werror=u ...

  5. c语言缺少函数头怎么办,c语言编译时如何解决缺少头文件和库的问题

    问题原因: 我们都知道我们写一个程序不可能所有东西都重头去开发,因此我们会使用一些其它人写好的文件或者说叫做库函数等.但是有时候因为路径的设置不对,或者是文件的丢失,或者是文件版本不对,或者是文件的编 ...

  6. C语言编译时版本号自动加一,VC使用编译时间作为版本号标识的方法

    常用方法分两步: 1. 得到编译时间: 2. 设置基准时间,以编译时间距基准时间的总天数的2倍作为版本号,适当情况还可加上初值: 其中第一步实现有两种方法: 1. 直接使用系统宏:CString Oc ...

  7. c语言编译时字符黑色,C语言黑与白问题

    问题描述 有A.B.C.D.E这5个人,每个人额头上都帖了一张黑或白的纸.5人对坐,每 个人都可以看到其他人额头上纸的颜色.5人相互观察后: A说:"我看见有3人额头上贴的是白纸,1人额头上 ...

  8. C语言编译时无法打开文件,在VS2010下编译无法打开包括文件:“GL/glaux.h”: No such file or director...

    最近测试了一个OpenGL的示例程序: #include #include #include "glos.h" void main(void) { auxInitDisplayMo ...

  9. C语言编译时无法打开文件,2812c语言编译时头文件无法打开

    引用:louiewong 写道: 全部错误显示如下: ------------------------------  pmsm.pjt - Debug  ----------------------- ...

最新文章

  1. TensorRT PoolingLayer
  2. muduo之mutex和condition
  3. 【视频课】如何掌握好深度学习之视频分类与行为识别?这一门课足矣!
  4. Angular应用里的Template Reference变量
  5. Tushare在R中的使用
  6. 谈判失败:Oracle 杀死 Java EE
  7. 不在gopath目录下能使用godoc吗_一文搞懂 Go Modules 前世今生及入门使用
  8. STM32启动代码概述
  9. GROUP BY中ROLLUP/CUBE/GROUPING/GROUPING SETS使用示例
  10. 编程珠玑java_编程珠玑第八章
  11. linux查看redis安装目录
  12. 西部数据移动硬盘哪个型号好_西部数据移动硬盘怎么样(西数移动硬盘系列区别)...
  13. CODOSYS之结构化文本(ST)—— 初级篇(二)简介与基本概念
  14. IAR for ARM系列教程(三)_菜单(Ⅰ)
  15. 求[X,Y]内被除3余1并且被除5余3的整数的和
  16. oc错误:control reaches end of non-void function
  17. every()数组方法
  18. 骚操作!代码写情诗 | 程序员有话说
  19. linux卸载nps,CentOS安装nps
  20. UCOS操作系统——信号量与互斥信号量(九)

热门文章

  1. win10待机状态仍然联网设置
  2. Mac 终端命令收集
  3. anaconda中安装PIV库
  4. 指纹辨识传感器解决方案
  5. IGMP PROXY和IGMP SNOOPING 有什么区别?
  6. Jmeter安装手记
  7. 【论文笔记】标准正交基和投影在分布式控制中的应用
  8. 中台的问题,是技术的问题,还是人的问题
  9. MySQL中查询和删除重复行
  10. 深入理解linux white函数,OpenGL超级宝典学习笔记——曲线和曲面(一)