记录一次奇怪但是很有意义的程序编译警告

代码都很简单就是一个简单的分模块的建议计算器,不考虑实用性和健壮性,就是个上课的小demo程序,只要能说明问题就行:

calE.h代码:

  1 #include "calG.h"
  2
  3 #ifndef calE_h
  4 #define calE_h
  5
  6 typedef (*ptrfCal)(int, int);
  7 ptrfCal selCal(char ch){
  8     ptrfCal cal = NULL;
  9     switch(ch){
 10         case ‘+‘:
 11             cal = add;
 12             break;
 13         case ‘-‘:
 14             cal = sub;
 15             break;
 16         case ‘*‘:
 17             cal = mul;
 18             break;
 19         case ‘/‘:
 20             cal = div;
 21             break;
 22         case ‘%‘:
 23             cal = mod;
 24             break;
 25         default:
 26             printf("please select in ‘+ - * / % ‘\n");
 27     }
 28
 29     return cal;
 30 }
 31
 32 #endif

calG.h代码:

  1 #ifndef calG_h
  2 #define calG_h
  3
  4 int add(int, int);
  5 int sub(int, int);
  6 int mul(int, int);
  7 int div(int, int);
  8 int mod(int, int);
  9
 10 #endif

calG.c代码:

  1 #include "calG.h"
  2
  3 int add(int var1, int var2){
  4     return var1 + var2;
  5 }
  6
  7 int sub(int var1, int var2){
  8     return var1 - var2;
  9 }
 10
 11 int mul(int var1, int var2){
 12     return var1 * var2;
 13 }
 14
 15 int div(int var1, int var2){
 16     return var1 / var2;
 17 }
 18
 19 int mod(int var1, int var2){
 20     return var1 % var2;
 21 }

testc.c测试文件:

  1 #include <stdio.h>
  2 #include "calG.h"
  3 #include "calE.h"
  4
  5 int main(int argc, char **argv)
  6 {
  7     printf("please input var1: ");
  8     int var1;
  9     scanf("%d", &var1);
 10     printf("please input calSel: ");
 11     char ch;
 12     int tmp = getchar();
 13     scanf("%c", &ch);
 14     printf("please input var2: ");
 15     int var2;
 16     scanf("%d", &var2);
 17
 18     ptrfCal cal = selCal(ch);
 19     printf("%d %c %d = %d\n", var1, ch, var2, cal(var1, var2));
 20
 21     return 0;
 22 }

Makefile文件:有了头文件,还有实现文件,还有测试文件,还要啥自行车,还是需要make文件的,万一哪天想更懒惰些呢。

  1 testc:testc.o calG.o
  2     gcc testc.o calG.o -o testc
  3
  4 clean:
  5     rm testc testc.o calG.o

准备工作到此为止,本来以为就是执行:

make

之后就是万事大吉,结果有一条警告出现了,意思是说声明ptrfCal是错误的int

cc    -c -o testc.o testc.c
In file included from testc.c:3:
calE.h:6:11: warning: type defaults to ‘int’ in declaration of ‘ptrfCal’ [-Wimplicit-int]
 typedef (*ptrfCal)(int, int);
           ^~~~~~~
cc    -c -o calG.o calG.c
gcc testc.o calG.o -o testc
pi  ~  WorkM  cCode  20191004  ./testc
please input var1: 10
please input calSel: +
please input var2: 5
10 + 5 = 15

程序的测试结果现实也没有问题,但是,我知道编译器的警告有时比错误还需要重视,因此,决定追究一下,原来是calE.h中的函数指针定义时,忘了写返回类型,修改成:

  1 #include "calG.h"
  2
  3 #ifndef calE_h
  4 #define calE_h
  5
  6 typedef int (*ptrfCal)(int, int);
  7 ptrfCal selCal(char ch){
  8     ptrfCal cal = NULL;
  9     switch(ch){
 10         case ‘+‘:
 11             cal = add;
 12             break;
 13         case ‘-‘:
 14             cal = sub;
 15             break;
 16         case ‘*‘:
 17             cal = mul;
 18             break;
 19         case ‘/‘:
 20             cal = div;
 21             break;
 22         case ‘%‘:
 23             cal = mod;
 24             break;
 25         default:
 26             printf("please select in ‘+ - * / % ‘\n");
 27     }
 28
 29     return cal;
 30 }
 31
 32 #endif 

修改了第6行的代码,再次编译,没有警告了:

 pi  ~  WorkM  cCode  20191004  make clean
rm testc testc.o calG.o
 pi  ~  WorkM  cCode  20191004  make
cc    -c -o testc.o testc.c
cc    -c -o calG.o calG.c
gcc testc.o calG.o -o testc

完美,成功了,收工,我一直觉得警告没有多大用处,很多c语言老师也告诉同学们,不要管警告,关注错误即可,实际上也不要轻易放过警告,除非你自己非常清楚怎么产生的警告,否则还是老实地把警告消除再继续下去吧。

原文地址:https://www.cnblogs.com/guochaoxxl/p/11622404.html

时间: 2024-10-11 08:44:32

记录一次奇怪但是很有意义的程序编译警告的相关文章

很认真的聊一聊程序员的自我修养

首先要谈的是,今天的话题所聊的程序员包含哪些人? 在中国,写程序,不仅仅是一种兴趣,更多的时候,还是一种普通职业和谋生工具 大公司有厉害的程序员,优秀的架构师,但大量的小公司也有很多普通的程序员.在我这些年的工作经历中,也越来越深刻的感受到普通程序员的影响和力量.对于高阶程序员,所谓八仙过海各有神通,各有各的成就,各有各的修养,但程序员在达成较高的水平之前,有一些"自我修养",是最基础的,是普世的. 所以今天的话题面向的程序员,就是所有的正在写代码或者曾经写过代码的程序员,也包括广义上

很认真地聊一聊程序员的自我修养

最近看了<浅谈程序员的英语学习>,对于文章中的观点我非常认同,英语是非常重要的,但文章站的高度还是太高,具体表述的学习方法我不是很认同,也认为不太实际,恰好之前有一篇一直没有发表的文章想重新发布,就借此机会和大家很认真的谈一谈程序员的自我修养问题. 先介绍一下利益相关,我的背景: 初中开始参加信息学与数学竞赛,大学本科软件工程专业,毕业后在银行做大数据分析与项目管理,后自主创业,做过传媒公司.软件外包公司,现在中国(南京)软件谷有个工作室,做些自己喜欢的事情.15年编码经验,6年创业经验.主要

使用 Excel 可以很方便的做程序原型

使用 Excel 可以很方便的做程序原型 比如计算 单片机的商品模式,可以使用 Excel 很方便的计算出来,花了 15 分钟做好. 然后如果再使用软件可以很方便的根据 Excel 原型做出. 原文地址:https://www.cnblogs.com/F4NNIU/p/excel-demo.html

金蝶K3很有意义的数字3

金蝶公司的开发者对于3这个数字好像有特别的爱好,实际工作那么 多年逐步发现金蝶 对于3有特别的意义 . 举例: 1.K3试期账期,不能超过3期. 2.总账如果的结账迟过其他财务模块,例如出纳模块,那么出纳就不能结过3期的作业,或查询. 3.MRP展期的时间,如果供应链模块,未结账超过3年,将不能再往后展期. 有家公司,一直没做供应链的核算并结账,只使用采购,入库等仓库模块,且使用MRP计划用料表,一起很正常.突然有一天发现,无论如何设置MRP的展期,日期都固定在一个日期不变,最后发现,因为这个日

初学后缀数组记录(然而并不是很会。。&amp;&amp;很水。。)

两篇很赞的博文: 后缀数组 最详细讲解 (这一篇代码注释很详细,可以好好研读一番) 知识点 后缀数组 orz后缀数组代码 后缀数组主要实现思想就是倍增法+基数排序,代码难也是因为这两者要同时运用. 如果对基数排序还不懂,可以参考一下这篇博文: 基数排序 今后还是要继续学这个神仙操作,继续加油. 原文地址:https://www.cnblogs.com/acboyty/p/9520959.html

一段非常值得珍藏的Java代码,Socket模拟容器,尽管简单但却很有意义

Tomcat.Weblogic.Jetty.WebService做了什么样子的事情呢?只不过是通过SOCKET来监听服务器上某一个端口的请求,进行请求的处理,并且将响应信息写回去.简单的说就是这样了,但是复杂里面讲呢,Tomcat必须要兼顾安全.标准.完美兼容HTTP的规范.多线程支持.数据库,数据源支持.可配置.Web端管理.SSL等等方面,所以又是非常复杂的.下面是一个例子,对于新手而言是非常有用的一段代码. package com.ziwen.container; import java.

今天,是很有意义的一天,因为什么呢?

发现真机调试确实快,不是快一点半点,草,以前没有试过,真是速度 今天写Hander 写函数的时候没有看清,写的是 final Handler handler=new Handler(){ public void handleMessage(Message msg){ if(mag.what==0x123) { gameView.invalidate(); } } };

很好用的程序员在线画图软件

今天向大家推荐一个很好用的在线画图软件: 今天向大家推荐一个很好用的在线画图软件: 今天向大家推荐一个很好用的在线画图软件:(重要的事情说三篇) 连接地址如下:https://www.processon.com/i/55e3195de4b0df98fd2d14ba 使用效果图如下:

记录在Python2.7 x64 bit 下 PyQt5.8的编译过程

由于工作需要使用python下面的Qt库.PyQt现在只提供针对Python3.X系列的PyQt,所有需要自己手动编译.防止忘记,特意写下随笔记录备忘. 工 作  环境:Python版本:Python2.7 x64 版本, win10 64位系统 需求Qt版本:Qt5.8 编译过程如下: 1. 下载Qt5.8 版本: http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.8/5.8.0/qt-opensource-windows-x86-msvc20